Допустим, у меня есть коллекция из 100 элементов. Обычный перечислитель будет повторять эти 100 элементов.
Я хотел бы создать перечислитель (который основан на обычном перечислителе, т. Е. Не для каждой коллекции, а один общий подход), область действия которого от "хе-хе" до "там" - и я мог бы иметь например, итерация более 20 элементов только в середине.
void foo(IEnumerable<int> coll)
{
var regular_iter = coll.GetEnumerator();
regular_iter.MoveNext();
regular_iter.MoveNext();
// ... 8 more
var scoped_iter = new ScopeEnumerator(regular_iterator,20);
Так что в том случае, когда я вызываю "scoped_iter.Reset ()", он сбрасывается до его элемента 0 (10-й для всей коллекции).
А также «видит» только элементы с 10-30.
Вопрос - как реализовать такой перечислитель?
Редактировать
1
Мне нужен итератор «здесь», а не «там», потому что добраться до «там» может занять очень много времени. Однако на самом деле это незначительная вещь, наиболее проблематичным является метод Reset.
2
Джон спросил о фоне. Чего я действительно пытаюсь добиться, так это нарезать коллекцию (т. Е. У вас есть, скажем, коллекция из 10 строк, но вы хотели бы интерпретировать ее как коллекцию из 5 элементов, каждый из которых представляет собой коллекцию из 2 строк). Наивный алгоритм довольно прост, но также очень неэффективен. С коллекцией ~ 16MB (список строк) я подумал о другом подходе - просто переосмыслить данные, не копируя их. Поэтому я бы создал один итератор, который выбирает каждый элемент SIZE_OF_SLICE из всей коллекции, а также я бы создал этот ограниченный итератор, который начинался бы с первого итератора и использовался для элементов SIZE_OF_SLICE.
Таким образом, данные будут повторно использоваться на месте, единственное отличие будет в том, как вы их итерируете. Это достаточно для нарезки и это должно быть быстро.
3
Я реализовал эффективное разделение для IList (если вы предполагаете, что у вас есть индексатор, это очень просто), но это меня беспокоит, вы не можете (?) Предоставить общий эффективный алгоритм для списков (LinkedList) и массивов (List). Поэтому, если вы читаете это и у вас есть идея, как это сделать, не стесняйтесь отвечать, даже через 10 лет (при условии, что C # все еще будет с нами).