Я согласен с Рэйфом, что неопределенное поведение более правильно. Только версионные коллекции могут генерировать исключения, и не все коллекции версионируются (самый большой пример - массивы). Даже версионные коллекции могут вести себя неправильно, если вы делаете ровно 2 ^ 32 изменения между вызовами на MoveNext
.
Предполагая, что вы действительно заботитесь о поведении версий, решение состоит в том, чтобы получить Enumerator
для IList
и вызывать MoveNext
для каждой итерации:
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++];
}
Таким образом, вы получаете O (1) поведение путем индексации, но вы все равно получаете все поведение при вызове исключения MoveNext
. Обратите внимание, что мы вызываем MoveNext
только для побочных эффектов; мы игнорируем значения, по которым оно перечисляется.