Существует множество алгоритмов 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?