共用方式為


鏈結查詢範例 (C#) (LINQ to XML)

此範例是以 延後執行範例中的範例 為基礎,並顯示當您將兩個查詢鏈結在一起時會發生什麼情況,這些查詢同時使用延後執行和延遲評估。

範例:新增一個使用 yield return 延遲執行的第二個擴充方法

在此範例中,會引進另一個擴充方法, 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!!!<

在此範例中,您可以看到每個擴充方法會針對來源集合中的每個元素逐一操作。

本範例應該清楚的是,即使我們已將產生集合的查詢鏈結在一起,也不會具體化任何中繼集合。 相反地,每個項目都會從一個惰性方法傳遞至下一個方法。 這會產生比先採用一個字串陣列的方法小得多的記憶體使用量,然後建立已轉換成大寫的第二個字串陣列,最後建立第三個字串陣列,其中每個字串都有附加的驚嘆號。

本教程中的下一篇文章說明中級實體化:

另請參閱