Я иногда в ситуации, когда мне приходится обрабатывать перечислимые несколько раз. Если перечисление является дорогостоящим, неповторяемым и дает много данных (например, IQueryable, который читает из базы данных), перечисление нескольких раз не является опцией, и не буферизует результат в памяти.
До сегодняшнего дня я часто заканчивал тем, что писал классы агрегатора, в которые я мог нажимать элементы в цикле foreach и в конечном итоге читать результаты - гораздо менее изящный, чем LINQ.
Но подождите, я просто сказал «толчок»? Разве это не звучит ... реактивно? Поэтому я думал во время прогулки по вечерам. Назад домой Я попробовал - и это работает!
В этом примере фрагмент кода показывает, как получить как минимальные и максимальные элементы из последовательности целых чисел в один проход, используя стандартные операторы LINQ (те из Rx, то есть):
public static MinMax GetMinMax(IEnumerable<int> source)
{
// convert source to an observable that does not enumerate (yet) when subscribed to
var connectable = source.ToObservable(Scheduler.Immediate).Publish();
// set up multiple consumers
var minimum = connectable.Min();
var maximum = connectable.Max();
// combine into final result
var final = minimum.CombineLatest(maximum, (min, max) => new MinMax { Min = min, Max = max });
// make final subscribe to consumers, which in turn subscribe to the connectable observable
var resultAsync = final.GetAwaiter();
// now that everybody is listening, enumerate!
connectable.Connect();
// result available now
return resultAsync.GetResult();
}
Это не ответьте на вопрос, который был «Можно ли еще раз вызвать методы Linq для IEnumerable?» ... ответ - нет". –
Ну, что означает «ОК», это немного неясно. Вы можете многократно перебирать список, сколько захотите. Я упоминаю последствия этого в моем ответе. Как это не нормально перебирать их? Отправьте свой собственный ответ, если вы так думаете (хотя уже есть принятый ответ). –
Совершенно ясно. 'items' - это IEnumerable, а не список, и вы можете только переходить его один раз. Нет необходимости публиковать другой ответ, но для читателей важно понять, что это неправильно и даже не затрагивает вопрос. –