给定一个函数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>
的 seq 。
映射函数为: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
“为目前选择的每个元素选择一个值,并按给定的键对元素进行分组。”
关于linq - 如何将 IGrouping<Key, Value> 映射到 IGrouping<Key, Value>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28865678/