如何将 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."
给定函数 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."