2013-03-19 21 views
0

在C#中,您只需使用SelectMany,它有一個用於保存父對象的重載。你如何在F#中做同樣的事情?也就是說,我想迭代一組程序集並返回所有具有實現特定屬性的類的程序集。如何在保持父對象的同時使一組變平?

我知道我collect類似於選擇很多,但我不知道如何使用它,同時維護父(組裝)信息。

+0

聽起來好像你只是想_filter_程序集列表。是對的嗎? – Daniel 2013-03-19 16:52:44

+0

本質上是正確的,但是如何在沒有巨大嵌套混亂的情況下過濾?這就是我想要做的。 – sircodesalot 2013-03-19 18:38:20

+0

相關:http://stackoverflow.com/questions/4599657/f-list-selectmany/4600047 – gradbot 2013-03-19 20:06:40

回答

1

您可以通過應用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 } 
+0

真棒,從這裏學到很多有用的信息。再次感謝! – sircodesalot 2013-03-19 18:41:02

1

它看起來像你只需要的collectfilter代替:

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> 
+0

說真的,我花了太多的時間在這個這麼簡單的答案。嘿,非常感謝! – sircodesalot 2013-03-19 18:40:21

相關問題