Linq.Where(x => x == 1) - 编译器在做什么

时间:2011-05-23 22:07:13

标签: c# linq

我知道Linq是defferedexecution但我想了解编译器对这样的语句做了什么以及它是如何工作的

我发现Linq引人入胜,但我担心我不明白引擎盖下发生的事情

4 个答案:

答案 0 :(得分:6)

Where()是一种可以实现的扩展方法:

IEnumerable<T> Where(self IEnumerable<T> sequence, Func<T, bool> predicate) 
{
    foreach(T current in sequence)
        if( predicate(current) )
            yield return current;
}

x =&gt; x == 1是一个匿名过程,如果x == 1则返回true,否则返回false,如下所示:

bool predicate(T value)
{
    return value == 1;
}

有关Where()编译中迭代器块如何编译的详细信息,有一个很棒的系列文章解释了如何在Eric Lippert的博客上以here开始编译它们。

答案 1 :(得分:2)

它将查询过滤为等于1的值。考虑

IEnumerable<int> values = ...;
IEnumerable<int> filteredValues = values.Where(x => x == 1);

另一种写这个的方法是以下

public static IEnumerable<int> ExampleWhere(IEnumerable<int> values) {
  foreach (var x in values) {
    if (x == 1) {
      yield return 1;
    }
  }
}

答案 2 :(得分:2)

这取决于底层集合是什么。如果您正在谈论LINQ to SQL,LINQ to Entities或LINQ,它可以产生巨大的差异。例如,如果这只是List上的一个语句,它基本上是foreach枚举器的简写,其中只有与条件匹配的项在结果枚举中返回。

答案 3 :(得分:2)

这样做:

IQueryable<int> seq = ...;
return Queryable.Where(seq, Expression.Lambda(Expression.Equals(Expression.Constant(1), Expression.Parameter("x"))));

这只是略微简化了。

编辑:我应该说我认为seq是IQueryable的情况。在这种情况下,指定的linq提供者并不重要。