0

C#SelectManyでは、親オブジェクトを保持するためのオーバーロードがあるを使用します。F#で同じことをどのように行いますか?つまり、一連のアセンブリを繰り返し処理し、特定の属性を実装するクラスを持つすべてのアセンブリを返します。

多くを選択するのと似ていることは知ってcollectいますが、親(アセンブリ)情報を維持しながら使用する方法がわかりません。

4

2 に答える 2

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>
于 2013-03-19T17:01:51.910 に答える
1

「親」コレクションの各要素に対して返したい「子」のコレクションにを適用することにより、をSelectMany使用して実装できます。collectmap

いくつかあり、 (の各要素に対して)sourceを使用して子を取得したい場合、子と親の両方を使用して結果を計算する場合は、次を使用して次のように記述できます。getChildrensourceselectResultSelectMany

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 }
于 2013-03-19T17:21:43.353 に答える