在定義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]。