Почему не • Методы расширения Linq находятся в IEnumerator, а не в IEnumerable?

Существует множество алгоритмов Linq, которым требуется только один проход через ввод, например Select.

Тем не менее, все методы расширения Linq основаны на IEnumerable, а не на IEnumerator

    var e = new[] { 1, 2, 3, 4, 5 }.GetEnumerator(); 
    e.Select(x => x * x); // Doesn't work 

Это означает, что вы не можете использовать Linq в любой ситуации, когда вы читаете из «уже открытого» потока.

Этот сценарий часто случается для над проектом, над которым я сейчас работаю - я хочу вернуть IEnumerator, чей метод IDispose закроет поток, а весь последующий код Linq будет работать с этим.

Короче говоря, у меня есть «уже открытый» поток результатов, который я могу преобразовать в соответствующий одноразовый IEnumerator - но, к сожалению, для всего последующего кода требуется IEnumerable, а не IEnumerator, даже если он будет выполнять только один «проход».

т.е. я хочу " реализовать "этот тип возвращаемого значения в различных источниках (файлы CSV, IDataReaders и т. д.):

class TabularStream 
{ 
    Column[] Columns; 
    IEnumerator<object[]> RowStream; 
}

Чтобы получить" Столбцы ", я должен уже открыть файл CSV, инициировать запрос SQL или что-то еще. Затем я могу вернуть «IEnumerator», метод Dispose которого закрывает ресурс, но для всех операций Linq требуется IEnumerable.

Лучшее обходное решение, о котором я знаю, - реализовать IEnumerable, метод GetEnumerator () которого возвращает однозначное значение. только IEnumerator и выдает ошибку, если что-то пытается выполнить вызов GetEnumerator () дважды.

Звучит ли все нормально, или есть способ лучше реализовать "TabularStream" таким образом, чтобы его было легко использовать из Linq?

12
задан Paul Hollingsworth 16 September 2010 в 09:17
поделиться