2

function が与えられた場合f:ValueA -> ValueB、タイプの IGrouping を にどのようにマップできIGrouping<Key, ValueA>ますIGrouping<Key, ValueB>か?

問題のインスタンス:

あなたがこのタイプを持っているとしましょう:

TaggedItem = { Tag:Tag ; Item:Item }

そしてこのクエリ:

query {
    for i in taggedItems
    groupBy i.Tag into g
    select g
}

これにより type: の seq が得られますが、IGrouping<Tag, TaggedItem>実際には type: の seq が必要ですIGrouping<Tag, Item>。マッピング関数は次のとおりです。fun taggedItem -> taggedItem.Item

解決

解決策は、グループ化のマッピングを回避し、代わりに、選択した回答で指摘されているように、groupValBy を使用して、グループ化中に変換を行うことです。選択した回答は、あるタイプのグループから別のグループへのマッピングを行う方法も示しています。

query {
    for i in taggedItems
    groupValBy i.Tag i.Item into g
    select g
}
4

1 に答える 1

2

これはどう?

let mapGrouping f (xs : IGrouping<_,_>) =
    let projection = xs |> Seq.map (fun x -> xs.Key, f x)
    (projection.GroupBy (fst, snd)).First()

コード例から、これが必要だと思います:

query {
    for i in taggedItems do
    groupValBy i.Item i.Tag into g
    select g
    }

https://msdn.microsoft.com/en-us/library/hh225374.aspxで、 groupValBy「これまでに選択された各要素の値を選択し、指定されたキーで要素をグループ化する」ことがわかります。

于 2015-03-04T22:03:59.600 に答える