有很多类似的问题和答案,但我没有发现任何符合我正在搜索的标准。
我有以下产品清单:
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会很棒。
答案 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())