Вы можете реализовать SelectMany
с помощью collect
путем применения map
к сборнику «детей», которые вы хотите, чтобы вернуться к каждому элементу " родитель»коллекция:
Если у вас есть некоторые source
и хотят, чтобы дети с помощью getChildren
(для каждого элемента в source
), а затем вы хотите, чтобы вычислить результат, используя selectResult
, который принимает как ребенок и родитель, вы можете написать следующее с помощью SelectMany
:
source.SelectMany
((fun parent -> getChildren parent),
(fun parent child -> selectResult parent child))
Использования collect
тот же код выглядит следующим образом (обратите внимание, что map
операции применяется внутри лямбда-функции, которые мы передаем в collect
- где parent
все еще находится в области видимости):
source |> Seq.collect (fun parent ->
getChildren parent
|> Seq.map (fun child ->
selectResult parent child))
стоит также отметить, что поведение захвачена SelectMany
может быть реализован - возможно, в более удобном для восприятия способом - с помощью F выражений # последовательности, как это:
seq { for parent in source do
for child in getChildren parent do
yield selectResult parent child }
Похоже, вы просто хотите, чтобы _filter_ список сборок. Это правильно? – Daniel
По сути, правильно, но как я могу фильтровать без огромного вложенного беспорядка? Это то, что я пытаюсь сделать. – sircodesalot
Связанный: http://stackoverflow.com/questions/4599657/f-list-selectmany/4600047 – gradbot