C# Linq 延遲查詢的執行

沉默♪☞小傲發表於2021-04-18

在定義linq查詢表示式時,查詢是不會執行,查詢會在迭代資料項時執行。它使用yield return 語句返回謂詞為true的元素。

var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };
var namesWithJ = from n in names
                 where n.StartsWith("J")
                 orderby n
                 select n;
Console.WriteLine("First iteration");
foreach (string name in namesWithJ) 
{
    Console.WriteLine(name);
}
Console.WriteLine();

names.Add("John");
names.Add("Jim");
names.Add("Jack");
names.Add("Denny");

Console.WriteLine("Second iteration");
foreach (string name in namesWithJ)
{
    Console.WriteLine(name);
}

執行結果為

First iteration
Juan

Second iteration
Jack
Jim
John
Juan

從執行結果可以看出,當在定義namesWithJ時並不會執行,而是在執行每個foreach語句時進行,所以後面增加的“John”、“Jim”、“Jack”和“Denny”在第二次迭代時也會參與進來。

ToArray()、ToList()等方法可以改變這個操作,把namesWithJ的定義語句修改為

var namesWithJ = (from n in names
                  where n.StartsWith("J")
                  orderby n
                  select n).ToList();

執行結果為

First iteration
Juan

Second iteration
Juan

在日常工作中,我們常會使用 datas.Where(x=>x.XX == XXX).FirstOrDefault() 和 datas.FirstOrDefault(x=>x.XX == XXX),其實這兩種寫法效能是等效的,如果真的要在效能上分個高低,請見接下來的文章

應避免錯誤寫法是 datas.Where(x=>x.XX == XXX).ToList()[0]。

 

相關文章