Почему не надо? • Методы расширения 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 () дважды. Спасибо.

Недавно я наткнулся на этот термин, но понятия не имею, к чему он относится. Я искал в Интернете, но без особого успеха. Спасибо.

10
задан Kevin 16 September 2010 в 09:18
поделиться