在C#中,您只需使用SelectMany
,它有一個用於保存父對象的重載。你如何在F#中做同樣的事情?也就是說,我想迭代一組程序集並返回所有具有實現特定屬性的類的程序集。如何在保持父對象的同時使一組變平?
我知道我collect
類似於選擇很多,但我不知道如何使用它,同時維護父(組裝)信息。
在C#中,您只需使用SelectMany
,它有一個用於保存父對象的重載。你如何在F#中做同樣的事情?也就是說,我想迭代一組程序集並返回所有具有實現特定屬性的類的程序集。如何在保持父對象的同時使一組變平?
我知道我collect
類似於選擇很多,但我不知道如何使用它,同時維護父(組裝)信息。
您可以通過應用map
到要返回的每一個元素「,「孩子」集合SelectMany
使用collect
實現父」收藏:
假設你有一些source
並想用getChildren
(在source
每個元素),以讓孩子們,然後要計算使用結果這既需要孩子和家長,您可以編寫使用SelectMany
如下:
source.SelectMany
((fun parent -> getChildren parent),
(fun parent child -> selectResult parent child))
使用collect
,同樣的代碼如下所示(請注意,map
操作是,我們傳遞給lambda函數內部應用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 }
真棒,從這裏學到很多有用的信息。再次感謝! – sircodesalot 2013-03-19 18:41:02
它看起來像你只需要的collect
filter
代替:
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>
說真的,我花了太多的時間在這個這麼簡單的答案。嘿,非常感謝! – sircodesalot 2013-03-19 18:40:21
聽起來好像你只是想_filter_程序集列表。是對的嗎? – Daniel 2013-03-19 16:52:44
本質上是正確的,但是如何在沒有巨大嵌套混亂的情況下過濾?這就是我想要做的。 – sircodesalot 2013-03-19 18:38:20
相關:http://stackoverflow.com/questions/4599657/f-list-selectmany/4600047 – gradbot 2013-03-19 20:06:40