在单个LINQ查询中生成的迭代次数

时间:2013-12-05 09:16:05

标签: c# linq

使用时我总是对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中吗?)

1 个答案:

答案 0 :(得分:1)

实际上,您的查询将编译为单个Where运算符:

var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]);

将创建两个枚举器:

  • 一个用于按谓词过滤源
  • 一个用于枚举已过滤的来源以对项目进行排序