我在使用LINQ的时候总是有一个疑问。
以下代码生成了多少个迭代器(测试是一个列表):
var result = from t in test
where t.Length > 0 && t.Length < 5
orderby t[0]
select t;
据我所知,这个查询被编译为:
var result2 = test.Where(t => t.Length > 0).Where(t => t.Length < 5).OrderBy(t => t[0]);
我检查了 .NET 源代码,发现Where 实现只是调用谓词函数并产生结果:
private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
{
int iteratorVariable0 = -1;
foreach (TSource iteratorVariable1 in source)
{
iteratorVariable0++;
if (predicate(iteratorVariable1, iteratorVariable0))
{
yield return iteratorVariable1;
}
}
}
我相信微软以类似的方式实现 OrderBy 和其他函数(我想是 OrderBy 的 OrderedEnumerable )。
这是否意味着 LINQ 将为这个单个查询创建多个枚举器,这意味着我的列表中的某些内容将被复制多次? (我想,yield return 语句会将元素复制到列表中?)
实际上你的查询将被编译成单个Where
操作员:
var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]);
总共将创建两个枚举器:
- 一种用于通过谓词过滤源
- 一个用于枚举过滤源以对项目进行排序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)