使用时我总是对LINQ有疑问。
为以下代码生成了多少个迭代器(test是一个List):
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;
}
}
}
我相信Microsoft以类似的方式实现OrderBy和其他函数(我猜想OrderBy的OrderedEnumerable)。
这是否意味着LINQ将为此单个查询创建多个枚举器,这意味着我的列表中的某些内容将被复制多次? (yield return语句会将元素复制到我想要的List中吗?)
答案 0 :(得分:1)
实际上,您的查询将编译为单个Where
运算符:
var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]);
将创建两个枚举器: