如何将IGrouping <key,value =“”>映射到IGrouping <key,value =“”>?</key,> </key,>

时间:2015-03-04 21:48:19

标签: linq f# igrouping

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

问题实例:

说你有这种类型:

TaggedItem = { Tag:Tag ; Item:Item }

和这个查询:

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

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

解决方案

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

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

1 个答案:

答案 0 :(得分: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“为目前为止选择的每个元素选择一个值,并按给定的键对元素进行分组。”