这是一个例子:

static int Main(string[] args)
{
    foreach(string arg in args.Skip(77))
    {
        Console.WriteLine(arg);
    }

    return 0;
}

假设args足够,这会在MoveNext内部调用Skip 77次吗?还是Skip直接跳到适当的索引?

最佳答案

尴尬的是,我错了。
没有。

public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count) {
    if (source == null) throw Error.ArgumentNull("source");
    return SkipIterator<TSource>(source, count);
}

static IEnumerable<TSource> SkipIterator<TSource>(IEnumerable<TSource> source, int count) {
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        while (count > 0 && e.MoveNext()) count--;
        if (count <= 0) {
            while (e.MoveNext()) yield return e.Current;
        }
    }
}
乔恩·斯基特(Jon Skeet)explains为什么不能做到这一点。

10-08 19:16