Contoh kueri rantai (C#) (LINQ ke XML)

Contoh ini didasarkan pada contoh dalam contoh eksekusi yang ditangguhkan dan menunjukkan apa yang terjadi ketika Anda menghubungkan dua kueri yang keduanya menggunakan eksekusi yang ditangguhkan dan evaluasi tunda.

Contoh: Menambahkan metode ekstensi kedua yang menggunakan yield return untuk menunda eksekusi

Dalam contoh ini, metode ekstensi lain diperkenalkan, AppendString, yang menambahkan string tertentu ke setiap string dalam koleksi sumber, lalu menghasilkan string yang diubah.

public static class LocalExtensions
{
    public static IEnumerable<string>
      ConvertCollectionToUpperCase(this IEnumerable<string> source)
    {
        foreach (string str in source)
        {
            Console.WriteLine("ToUpper: source >{0}<", str);
            yield return str.ToUpper();
        }
    }

    public static IEnumerable<string>
      AppendString(this IEnumerable<string> source, string stringToAppend)
    {
        foreach (string str in source)
        {
            Console.WriteLine("AppendString: source >{0}<", str);
            yield return str + stringToAppend;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string[] stringArray = { "abc", "def", "ghi" };

        IEnumerable<string> q1 =
            from s in stringArray.ConvertCollectionToUpperCase()
            select s;

        IEnumerable<string> q2 =
            from s in q1.AppendString("!!!")
            select s;

        foreach (string str in q2)
        {
            Console.WriteLine("Main: str >{0}<", str);
            Console.WriteLine();
        }
    }
}

Contoh ini menghasilkan output berikut:

ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<

ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<

Dalam contoh ini, Anda dapat melihat bahwa setiap metode ekstensi beroperasi satu per satu untuk setiap item dalam koleksi sumber.

Apa yang harus jelas dari contoh ini adalah bahwa meskipun kami telah menyatukan kueri yang menghasilkan koleksi, tidak ada koleksi perantara yang terwujud. Sebagai gantinya, setiap item diteruskan dari satu metode malas ke metode berikutnya. Ini menghasilkan penggunaan memori yang jauh lebih kecil dibandingkan dengan pendekatan yang akan mengambil satu array string terlebih dahulu, kemudian membuat array kedua dari string yang telah dikonversi menjadi huruf besar, dan akhirnya membuat array ketiga dari string di mana setiap string tersebut ditambahkan tanda seru.

Artikel berikutnya dalam tutorial ini mengilustrasikan materialisasi menengah:

Lihat juga