Ответ 1
Основной бит, о котором следует помнить, заключается в том, что SelectMany
работает с IEnumerable
и возвращает IEnumerable
, используя лямбда-выражения, имеющие доступ к текущему элементу и его индексу. Итак, все, что вы могли бы сделать, чтобы преобразовать результат с доступом к текущему элементу или его индексу, возможно:
- Определите, какие элементы сохранить или выбросить (
Where
,First
,Take
,Skip
,TakeWhile
) - Измените элементы и верните новые (
Select
) - Есть ли другие вещи? (
GroupBy
, честно говоря, я не знаю, как бы это реализовать, не задумываясь)
Этот простой пример Where
даст понять, как многие из них могут быть выполнены легко:
SomeList.SelectMany(x =>
ShouldBeIncluded(x) ?
Enumerable.Repeat(x, 1) :
Enumerable.Empty<AClass>();
);
Edit - Great размещенная Тимом Шмельтером в комментариях, снова подтверждает, что Джон Скит уже сделал это более чистым:
return Enumerable.Repeat(x, ShouldBeIncluded(x) ? 1 : 0;