• Linq延迟求值


    Linq语句只有在调用结果的时候才会真正执行,如下

     1 static void Main(string[] args)
     2         {
     3             PersonList personList = new PersonList();
     4             personList.CurrentIndex = 0;
     5             var r1 = from p in personList where p.Age == 18 select p ;
     6             Console.WriteLine(personList.CurrentIndex.ToString());
     7             personList.CurrentIndex = 0;
     8             var r2 = (from p in personList where p.Age >= 20 select p).First();
     9             Console.WriteLine(personList.CurrentIndex.ToString());
    10             personList.CurrentIndex = 0;
    11             var r3 = (from p in personList select p).Take(2);
    12             Console.WriteLine(personList. CurrentIndex.ToString());
    13 
    14             Console.ReadLine();
    15         }
    16     }
    17     class Person
    18     {
    19         public string Name { get; set; }
    20         public int Age { get; set; }
    21         public Person(string name, int age)
    22         {
    23             Name = name;
    24             Age = age;
    25         }
    26     }
    27     class PersonList : IEnumerable<Person>
    28     {
    29         List<Person> pList = new List<Person>()
    30     {
    31         new Person("Mike",20),
    32         new Person("John",23),
    33         new Person("Jack",18),
    34         new Person("Tom",34)
    35     };
    36         public void Add(Person person)
    37         {
    38             pList.Add(person);
    39         }
    40         public int CurrentIndex { get; set; }
    41         public IEnumerator<Person> GetEnumerator()
    42         {
    43             foreach (var p in pList)
    44             {
    45                 CurrentIndex++;
    46                 yield return p;
    47             }
    48         }
    49          IEnumerator IEnumerable.GetEnumerator()
    50         {
    51             return GetEnumerator();
    52         }
    53     }

    结果:

    0,

    1,

    0.

    第5行和第11行只有在调用r1,r3的时候才会真正执行,而我们并没有调用r1和r3,所以CurrentIndex为0,而第8行则直接执行。

    如果linq语句立刻执行,可以在后边加上ToList<>等方法。

  • 相关阅读:
    group_concat的长度限制
    mb_strlen默认字符集问题
    &符号导致的一个bug
    python面向对象编程系列
    python基础之面向过程编程系列
    RPA流程自动化
    什么是DevOps?
    ansible详解
    saas和paas的区别
    CPT/cpt接口
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3626776.html
Copyright © 2020-2023  润新知