在C#中,你只需使用SelectMany
,它有一个重载来保持父对象。你怎么在F#做同样的事情?也就是说,我想迭代一组程序集并返回所有具有实现特定属性的类的程序集。
我知道我collect
类似于选择多个,但我不确定如何在维护父(汇编)信息时使用它。
答案 0 :(得分:1)
您似乎只需要filter
而不是collect
:
let hasTypeWithAttribute<'t when 't :> Attribute> (a: Assembly) = a.GetTypes() |> Array.exists (fun t -> t.GetCustomAttributes(typeof<'t>, true).Length > 0)
let assemblies = inputSet |> Set.filter hasTypeWithAttribute<AttributeName>
答案 1 :(得分:1)
您可以使用SelectMany
通过将collect
应用于要为“父级”集合的每个元素返回的“子级”集合来实现map
:
假设您有一些source
,并希望让孩子使用getChildren
(对于source
中的每个元素),然后您想使用selectResult
来计算结果无论是孩子还是父母,您都可以使用SelectMany
编写以下内容:
source.SelectMany
( (fun parent -> getChildren parent),
(fun parent child -> selectResult parent child ) )
使用collect
,相同的代码如下所示(请注意,map
操作应用于我们传递给collect
的lambda函数中 - 其中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 }