Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单个LINQ查询中生成的迭代次数_C#_Linq - Fatal编程技术网

C# 在单个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,

在使用LINQ时,我总是对它有疑问

为以下代码生成了多少迭代器(测试是一个列表):

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]);