linq - 如何将 IGrouping<Key, Value> 映射到 IGrouping<Key, Value>?

标签 linq f# igrouping

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

相关文章:

c# - 获取特定类型的对象

.net - 为什么 F# Set 不实现 ISet<T>?

c# - 将 F# 函数部分应用程序转换为 C#

arraylist - F# 中的通用 O(1) 列表/数组?

c# - 使用 LinQ 的嵌套 IGrouping

c# - 如何在 ASP.NET MVC View 中对数据进行分组?

c# - 使用 Interface for DbContext 会导致子查询出现问题

asp.net - linq foreach 性能