Оптимизирует ли реализация .Net Framework Linq пропуск для индексируемых типов? - PullRequest
3 голосов
/ 26 августа 2011

Вот пример:

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

    return 0;
}

Если предположить, достаточно args, этот вызов MoveNext 77 раз внутри Skip? Или Skip прыгает прямо на соответствующий индекс?

1 Ответ

3 голосов
/ 26 августа 2011

смущающе, я ошибся.

номер

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;
        } 
    } 
}

Джон Скит объясняет , почему он не может этого сделать.

...