Where方法如何运行?

时间:2018-11-08 11:33:36

标签: c# linq lambda

我的code是:

using System;
using System.Linq;
using System.Collections.Generic;

public class D {
   public string Value { get; set; }
   public D(string v) { this.Value = v; }
}
public class Program
{
   public static void Main()
   {
       List<D> DD = new List<D>();
       DD.Add(new D("2018-11-08"));
       DD.Add(new D("2018-12-01"));
       var dd = DD.Where(d=> { 
          Console.WriteLine($"In predicate: {d.Value}"); 
          return d.Value=="2018-12-01"; 
       });

       var dl = dd.ToList();
       foreach (var d in dl) {
         Console.WriteLine($"Final: {d.Value}");
       }
   }
}

输出为:

In predicate: 2018-11-08
In predicate: 2018-12-01
Final: 2018-12-01

如果DD包含一百万个元素,DD.Where中的lambda是否执行一百万次?

如果DD是SQL Server中的表怎么办?

2 个答案:

答案 0 :(得分:6)

  

如果DD包含一百万个元素,则DD中的lambda将在哪里执行   一百万次?

答案取决于急切的操作。在这种特定情况下,,因为渴望的操作是ToList,但是说它是First()Any(),一旦找到一个符合条件。

答案 1 :(得分:0)

查询语法,基本上在其中创建方法和委托,并使用它来调用方法语法版本。无论您在哪里调用with都将变成单个方法,然后通过委托对源序列的每个元素进行调用,直到找到结果为止。

因此,可能发生的事情就是将一个检查作为一个整体表达式传递出去。

Where ( d.Value=="2018-12-01")
It will turn into a single method call like this

bool FindValueExample(var d){
  return (d.Value=="2018-12-01");
}

,然后在每个元素上调用。