从聚合的重复对象中列出,其中字符串属性从C#中的重复对象连接字符串

时间:2016-03-13 18:07:51

标签: c# linq

有很多类似的问题和答案,但我没有发现任何符合我正在搜索的标准。

我有以下产品清单:

var product = new List<Product> {
  new Product { Name = "apple", Quantity = 1, Store = "1" }, 
  new Product { Name = "orange",Quantity = 2, Store = "2" }, 
  new Product { Name = "apple", Quantity = 3, Store = "3" }, 
  new Product { Name = "lemon", Quantity = 4, Store = "4" } };

我想要实现的结果是:一个新的List,它只包含具有唯一名称的产品,其中数量是具有重复名称的产品数量的总和,而字符串属性Store将包含所有存储产品的商店。 (任何列表或数组也可用于存储商店) 我希望上面例子的结果是:

apple   4  1,3 
orange  2  2
lemon   4  4

目前我正在使用嵌套循环,但是搜索更易读的代码但不是性能。 使用LINQ GroupBy,DistinctItemComparer会很棒。

1 个答案:

答案 0 :(得分:4)

var query = product
    .GroupBy(x => x.Name)
    .Select(x => new 
    {
        Name = x.Key,
        Quantity = x.Sum(y => y.Quantity),
        Store = string.Join(",", x.Select(y => y.Store))
    });

以上内容应该是相当不言自明的。 GroupBy提供了不同的产品名称列表。从那里,您可以将数量和存储以及项目聚合为匿名类型。

可能要考虑为商店添加一个distinct子句,即string.Join(",", x.Select(y => y.Store).Distinct())