次の方法で共有


チェーン クエリの例 (C#) (LINQ to XML)

この例は 、遅延実行の例 に基づいており、遅延実行と遅延評価の両方を使用する 2 つのクエリを連結した場合の動作を示しています。

例: yield return を使用して実行を延期する 2 つ目の拡張メソッドを追加する

この例では、別の拡張メソッド AppendStringが導入され、指定した文字列がソース コレクション内のすべての文字列に追加され、変更された文字列が生成されます。

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();
        }
    }
}

この例では、次の出力が生成されます。

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!!!<

この例では、各拡張メソッドがソース コレクション内の各項目に対して一度に 1 つずつ動作することを確認できます。

この例から明らかな点は、コレクションを生成するクエリを連結しているにもかかわらず、中間コレクションは具体化されないということです。 代わりに、各アイテムが一方のレイジー メソッドから次のメソッドに渡されます。 これにより、最初に文字列の配列を 1 つ受け取り、次に大文字に変換された文字列の 2 番目の配列を作成し、最後に各文字列に感嘆符が追加された文字列の 3 番目の配列を作成する方法よりもはるかに小さいメモリ占有領域になります。

このチュートリアルの次の記事では、中間具体化について説明します。

こちらも参照ください