Существует множество алгоритмов Linq, которые нужно выполнить только один проход через вход, например. Выбрать.
Однако все методы расширения 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?