C#之Linq、where()、FindAll()的區別


對於實現了IEnumerable<T>接口的類、類型、集合可以使用Linq、Linq的擴展方法where()、FindAll()來查詢符合謂詞約束的數據。這三者之間執行的方式是不一樣的,同樣的數據同樣的查詢條件返回的結果也不相同。先上代碼再分析。

 

  1.  
    public static void LaterSelect()
  2.  
    {
  3.  
    var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };
  4.  
     
  5.  
    var namesWithJ = from n in names
  6.  
    where n.StartsWith("J")
  7.  
    orderby n
  8.  
    select n;
  9.  
    var namesWithJforWhere = names.Where<string>(n => n.StartsWith("J"));
  10.  
    var namesWithJforFindAll = names.FindAll(n => n.StartsWith("J"));
  11.  
    Console.WriteLine( "First iteration by Linq:");
  12.  
    foreach (string name in namesWithJ)
  13.  
    {
  14.  
    Console.WriteLine(name);
  15.  
    }
  16.  
     
  17.  
    Console.WriteLine( "First iteration by names.Where():");
  18.  
    foreach (var name in namesWithJforWhere)
  19.  
    {
  20.  
    Console.WriteLine(name);
  21.  
    }
  22.  
    Console.WriteLine( "First iteration by names.FindAll():");
  23.  
    foreach (var name in namesWithJforFindAll)
  24.  
    {
  25.  
    Console.WriteLine(name);
  26.  
    }
  27.  
     
  28.  
     
  29.  
    Console.WriteLine();
  30.  
     
  31.  
    names.Add( "John");
  32.  
    names.Add( "Jim");
  33.  
    names.Add( "Jack");
  34.  
    names.Add( "Denny");
  35.  
    Console.WriteLine( "Second iteration by Linq:");
  36.  
    foreach (string name in namesWithJ)
  37.  
    {
  38.  
    Console.WriteLine(name);
  39.  
    }
  40.  
    Console.WriteLine( "Second iteration by names.Where():");
  41.  
    foreach (var name in namesWithJforWhere)
  42.  
    {
  43.  
    Console.WriteLine(name);
  44.  
    }
  45.  
    Console.WriteLine( "Second iteration by names.FindAll():");
  46.  
    foreach (var name in namesWithJforFindAll)
  47.  
    {
  48.  
    Console.WriteLine(name);
  49.  
    }
  50.  
    }

輸出結果:

 

分析:

從輸出結果可以看出,Linq和where兩種方式的結果是相同的,說明這兩者之間沒有區別,當定義一個查詢后並沒有立即執行查詢而是在執行foreach循環的時候才執行查詢而且是在每一次執行foreach循環的時候去執行查詢,這樣只要數據是變化的結果就會是變化的。但是在一些情況下,這是不可行的。調用擴展方法 ToArray()、ToEnumerable()、ToList()等可以改變這個操作,使返回的結果始終一致,這里是在調用To*這些方法時執行了一次查詢而且不是延遲查詢。FindAll()方法和Linq、where是有區別的,FindAll()不是延遲加載或者說延遲查詢,當定義一個查詢后就立即查詢出所有符合條件的數據保存在變量中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM