共用方式為


將標準查詢運算子鏈結在一起 (C#) (LINQ to XML)

標準的查詢運算子也可以鏈結在一起。 例如,您可以插入 Enumerable.Where 運算子 (由 where 子句叫用),並以延遲的方式運作;也就是說,它不會具體化任何中繼結果。

範例:插入 where 子句

在此範例中,呼叫 Where 前,會先呼叫 ConvertCollectionToUpperCase 方法。 Where 方法會使用與本教學課程之前範例、ConvertCollectionToUpperCaseAppendString 中所使用之延遲方法幾乎完全相同的方式操作。

其中一種差異是,在這種情況下,Where 方法會逐一查看其來源集合、判斷第一個項目沒有傳遞述詞,然後取得下一個有傳遞的項目。 它接著會產生第二個項目。

不過,基本概念是一樣的:除非必要,否則系統不會具體化中繼集合。

使用查詢運算式時,這些運算式會轉換為標準查詢運算子的呼叫,因此適用相同的原則。

本節中,查詢 Office Open XML 文件的所有範例都使用相同的原則。 您必須了解延後執行與延遲評估的基礎概念,才能有效使用 LINQ 和 LINQ to XML。

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()
            where s.CompareTo("D") >= 0
            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<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

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

這是教學課程:將查詢鏈結在一起 (C#) 教學課程中的最後一篇文章。