zoukankan      html  css  js  c++  java
  • 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()不是延迟加载或者说延迟查询,当定义一个查询后就立即查询出所有符合条件的数据保存在变量中。

  • 相关阅读:
    cUBtYhaFzo
    「UVA1185」Big Number 解题报告
    「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
    「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
    「洛谷P1306」斐波那契公约数 解题报告
    「SP25784」BUBBLESORT
    「UVA12004」 Bubble Sort 解题报告
    「洛谷P2397」 yyy loves Maths VI (mode) 解题报告
    「学习笔记」珂朵莉树 ODT
    log4j
  • 原文地址:https://www.cnblogs.com/hedongnan/p/9513793.html
Copyright © 2011-2022 走看看