如何解决Linq.Wherex => x == 1-编译器正在做什么
|| 我知道Linq是defferedexecution,但是我想了解编译器如何使用这样的语句以及它如何在后台运行 我发现Linq令人着迷,但我担心我不明白引擎盖下正在发生的事情解决方法
where()是一种扩展方法,可以通过以下方式实现:
IEnumerable<T> Where(self IEnumerable<T> sequence,Func<T,bool> predicate)
{
foreach(T current in sequence)
if( predicate(current) )
yield return current;
}
x => x == 1是一个匿名过程,如果x == 1则返回true,否则返回false,如下所示:
bool predicate(T value)
{
return value == 1;
}
有关Where()中的迭代器块如何编译的详细信息,从埃里克·利珀特(Eric Lippert)的博客开始,有一个很好的系列说明如何编译它们。
,它将查询过滤为等于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;
}
}
}
,它取决于底层集合是什么。如果您通常谈论的是LINQ to SQL,LINQ to Entities或LINQ,则可能会有很大的不同。例如,如果这仅是关于List
的语句,则它基本上是foreach
枚举器的简写,其中仅匹配条件的项目才返回到结果枚举中。
,它是这样做的:
IQueryable<int> seq = ...;
return Queryable.Where(seq,Expression.Lambda(Expression.Equals(Expression.Constant(1),Expression.Parameter(\"x\"))));
这只是略微简化了。
编辑:我应该有资格在谈论seq是一个IQueryable的情况。在这种情况下,指定的linq提供程序无关紧要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。