5

プロパティを使用してデータにアクセスするクラスの F# リストがあります (C# で開発されたライブラリを使用しています)。1 つのプロパティでグループ化し、結果のタプルの 2 番目の項目の各プロパティに個別の関数を適用したいと思います。

例:

let grouped = list  |> Seq.groupBy (fun x -> x.Year) //group by the year property. Results in Seq<int * seq<myClass>>
                    |> Seq.map (fun (a, b) -> (a, //How to map generic functions to each remaining property in the second tuple?  

うまくいけば、これは誰かにとって意味があるでしょう。私の 2 番目のタプル項目は、groupBy から生じる seq です。MyClass の残りの各プロパティには、異なる機能を適用する必要があります。過去にプロパティを合計するために、次のようなことをしました:

|> Seq.map (fun (a, b) -> (a, b |> Seq.SumBy (fun x -> x.myProperty)))

いくつかのプロパティに Seq.map を使用して、このようなことをしたいと思います。

助けてくれてありがとう、リチャード

4

1 に答える 1

12

使用するプロパティをなんらかの方法で指定する必要があります。最も簡単な方法は、プロパティを読み取る関数のリストを作成することです。タイプがであると仮定するとMyType、次のように記述できます。

let properties = [ (fun (x:MyType) -> x.MyProperty) ]

グループを作成したら、propertiesList.mapまたはF#リスト内包表記を使用して)のすべてのプロパティを反復処理し、がグループで現在のプロパティがvalues |> Seq.sumBy propどこにあるかを計算できます。valuesprop

let grouped = 
  list  
  |> Seq.groupBy (fun x -> x.Year) 
  |> Seq.map (fun (key, values) -> 
       (key, [for prop in properties -> values |> Seq.sumBy prop ])

以外の集計関数を使用する必要がある場合はSeq.sumBy、(プロパティのリストの代わりに)実行する必要のある集計操作のリストを作成できます。

let properties = [ "MyPropSum", Seq.sumBy (fun (x:MyType) -> x.MyProperty);
                   "MyProp2Avg", Seq.averageBy (fun (x:MyType) -> x.MyProperty2) ]

さらに処理を簡単にするために、おそらく結果を含む辞書を作成します。これは、名前と値のペアを持つリストをdict関数に渡すことで簡単に実行できます。

let grouped = 
  list  
  |> Seq.groupBy (fun x -> x.Year) 
  |> Seq.map (fun (key, values) -> 
       (key, dict [for name, aggregate in properties -> name, aggregate values ])
于 2013-03-11T14:14:00.443 に答える