Linq GroupBy和Aggregate

14

给定以下列表:

var data = new[]
    {
        new {category = "Product", text = "aaaa"},
        new {category = "Product", text = "bbbb"},
        new {category = "Product", text = "bbbb"},
    };

如何按类别分组并返回一个包含类别和不同文本组合描述的对象?

例如,我希望最终得到:

{
    categroy="Product"
    description = "aaaa,bbbb,cccc"
}

尝试使用GroupBy和Aggregate,但是似乎有些不对劲。

data.GroupBy(x => x.category).Select(g => new
    {
        category = g.Key,
        description = g.Aggregate((s1, s2) => s1 + "," + s2)
     });

TIA

2个回答

28

为什么不使用String.Join(IEnumerable)方法?

data.GroupBy(x => x.category).Select(g => new
{
    category = g.Key,
    description = String.Join(",", g.Select(x => x.text))
});

使用Aggregate时应该按照以下步骤进行操作:

    description = g.Aggregate(string.Empty, (x, i) => x + "," + i.text)

第一个参数将种子起始值设置为String.Empty。第二个参数定义了将当前种子值(string)与当前元素(anonymous_type)连接的方法。


9
data.GroupBy(x => x.category).Select(g => new
    {
        category = g.Key,
        description = g.Select(x => x.text).Aggregate((s1, s2) => s1 + "," + s2)
     });

3
这如何改进被接受的答案?仅仅给出一段代码片段并不是很有帮助。解释一下为什么这是一个好的解决方案会有助于提高问问题者和未来读者的理解。 - Gert Arnold
1
你说得对,这个答案并没有显著的改进,但它是原始问题的一个简单答案(只需添加缺失的Select方法),而所有其他答案都改变了解决方案并给出了正确但可能复杂的答案。 - Mohammad Hajinezhad
“所有其他答案”是什么意思?唯一的其他答案根本不复杂。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接