C# 在单个LINQ查询中生成的迭代次数
在使用LINQ时,我总是对它有疑问 为以下代码生成了多少迭代器(测试是一个列表):C# 在单个LINQ查询中生成的迭代次数,c#,linq,C#,Linq,在使用LINQ时,我总是对它有疑问 为以下代码生成了多少迭代器(测试是一个列表): var结果=来自测试中的t 其中t.长度>0和t.长度t.Length>0)、Where(t=>t.Lengtht[0]); 我检查了.NET源代码,发现Where实现只调用谓词函数并生成结果: private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source,
var结果=来自测试中的t
其中t.长度>0和t.长度<5
orderby t[0]
选择t;
据我所知,此查询编译为:
var result2 = test.Where(t => t.Length > 0).Where(t => t.Length < 5).OrderBy(t => t[0]);
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;
}
}
}
私有静态IEnumerable迭代器(IEnumerable源,Func谓词)
{
int iteratorVariable0=-1;
foreach(源中的TSource iteratorVariable1)
{
迭代器变量0++;
if(谓词(iteratorVariable1,iteratorVariable0))
{
产生返回迭代器variable1;
}
}
}
我相信微软实现OrderBy和其他函数的方式与此类似(我想OrderBy的OrderedEnumerable)
这是否意味着LINQ将为此单个查询创建多个枚举数,这意味着我列表中的某些内容将被复制多次?(我想,yield-return语句会将元素复制到一个列表中?实际上,您的查询将被编译成单个
,其中运算符:
var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]);
var result2=test.Where(t=>t.Length>0&&t.Length<5).OrderBy(t=>t[0]);
将总共创建两个枚举器:
- 一个用于按谓词筛选源
- 一个用于枚举筛选源以对项目进行排序
Where枚举数有意义。那么这是否意味着元素将被复制2次@刀之魂 如果有引用类型(即类)的源,则只复制元素的地址。使用where
这不是问题,因为它只会逐个返回匹配的元素地址(一次只有一个副本)。不幸的是,OrderBy需要所有元素的地址才能对其进行排序。我只是想知道微软是如何实现LINQ的。这对我帮助很大。
var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]);