为什么LINQ中的Skip()不能优化对象?

cod*_*nix 5 .net linq optimization linq-to-objects

var res = new int[1000000].Skip(999999).First();
Run Code Online (Sandbox Code Playgroud)

如果此查询只使用索引器而不是遍历999999条目,那将是很好的.

我查看了System.Core.dll并注意到,与之相反Skip(),Count()扩展方法已经过优化.如果IEnumerable实现ICollection那么它只是调用Count属性.

Gab*_*abe 3

如果您查看对类似问题的回答,似乎应该很容易Skip为任何提供非幼稚(即抛出适当的异常)优化IList

    public static IEnumerable<T> Skip<T>(this IList<T> source, int count)
    {
        using (var e = source.GetEnumerator())
            while (count < source.Count && e.MoveNext())
                yield return source[count++];
    }
Run Code Online (Sandbox Code Playgroud)

当然,您的示例使用数组。由于数组在迭代期间不会抛出异常,因此即使执行像我的函数一样复杂的操作也是不必要的。因此,人们可以得出结论,微软没有优化它,因为他们没有想到这一点,或者他们认为这是一个不值得优化的常见情况。