如何将 IGrouping<Key, ValueA> 映射到 IGrouping<Key, ValueB>?

How to map an IGrouping<Key, ValueA> to a IGrouping<Key, ValueB>?

给定函数 f:ValueA -> ValueB,我如何将类型 IGrouping<Key, ValueA> 的 IGrouping 映射到 IGrouping<Key, ValueB>

问题实例:

假设你有这种类型:

TaggedItem = { Tag:Tag ; Item:Item }

和这个查询:

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

这会给你一个类型的序列:IGrouping<Tag, TaggedItem>,但我真的想要一个类型的序列:IGrouping<Tag, Item>。 映射函数为:fun taggedItem -> taggedItem.Item

解决方案

解决方案是避免分组映射,而是在进行分组时使用 groupValBy 进行转换,如所选答案所指出的那样。所选答案还显示了如何从一种类型的分组映射到另一种类型的分组,如果您坚持的话。

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

这个怎么样?

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 "selects a value for each element selected so far and groups the elements by the given key."