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