关于LINQ执行时机

时间:2022-04-21 04:29:41

准备数据:

  1. // 获取数据源
  2. int[] numbers = new int[] 
  3. { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
定义查询:
  1. // 定义查询
  2. var even = numbers
  3.     .Select(p =>
  4.    {
  5.        Console.WriteLine("Hi! " + p.ToString());
  6.        return p;
  7.    })
  8.    .Where(p => p % 2 == 0)
  9.    .OrderBy(p => p);

在定义查询是查询没有执行,在控制台不输出任何东西,只有在用到查询结果或者调用其他一些返回单值的方法时才会执行:

foreach (var item in even) { Console.WriteLine(item); }

执行代码时会输出什么呢?结果:

Hi! 6
Hi! 4
Hi! 2
Hi! 8
Hi! 6
Hi! 4
Hi! 2
Hi! 8
2
4
6

8

 

如果查询定义修改为:

  1. var even = numbers
  2.   .Where(p => p % 2 == 0)
  3.   .Select(p =>
  4.   {
  5.      Console.WriteLine("Hi! " + p.ToString());
  6.      return p;
  7.   })  
  8.   .OrderBy(p => p);

结果为:

Hi! 6
Hi! 4
Hi! 2
Hi! 8
2
4
6
8

 

如果查询定义为:

  1.                 var even = numbers
  2.                 .Where(p =>
  3.                 {
  4.                     Console.WriteLine("W: " + p.ToString());
  5.                     return p % 2 == 0;
  6.                 })
  7.                 .Select(p =>
  8.                 {
  9.                     Console.WriteLine("S: " + p.ToString());
  10.                     return p;
  11.                 })
  12.                 .OrderBy(p => {
  13.                     Console.WriteLine("O: " + p.ToString());
  14.                     return p;
  15.                 });

结果为:

W: 6
S: 6
W: 4
S: 4
W: 3
W: 2
S: 2
W: 9
W: 1
W: 7
W: 8
S: 8
W: 5
O: 6
O: 4
O: 2
O: 8
2
4
6
8