这是一个例子:
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为什么不能做到这一点。