2

给定一个函数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
}

这会给你一个类型的 seq: IGrouping<Tag, TaggedItem>,但我真的想要一个类型的 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 回答