在LINQ代码中合并重复数据而不影响其他数据

时间:2011-03-23 20:25:04

标签: c# linq

目标:
如果有任何重复,例如如果“_name:a”,_quantity:3“和”_name:a“,_quantity:6”应合并为“_name:a”,_quantity:9“,则应合并为一个列表与其他数据重复与否。

问题: 我有一个包含大量数据的列表,我不知道如何将重复数据合并到一个单元中+它不应该影响其他单元。如果可能的话,希望在不创建更多列表的情况下将所有内容发生在相同的列表中以实现结果。

List<Sale> myList = GetAllSalesList()


public classs Sale
{
     public string _name;
     public string _quantity;
}

3 个答案:

答案 0 :(得分:3)

这样的东西?

var mergedList = 
myList.GroupBy(x => x._name)
      .Select(g => new Sale{_name = g.Key, _quantity = g.Sum(x => x._quantity)})
      .ToList();

修改

我刚刚注意到_quantitystring,这是正确的吗? 如果是,请使用Sum()将代码段更改为:

g.Sum(x => int.Parse(x._quantity)).ToString()

当然_quantity代表int ...否则请使用doubledecimal等...

答案 1 :(得分:1)

您可以使用分组

来完成此操作
var query = from sales in list
            group sale by _name into grouped
            select new Sale
            {
               _name = grouped.Key,
               _quantity = grouped.Sum(x => x._quantity)
            }; 

var groupedList = query.ToList();

有关分组的更多信息,请参阅101页中的实际示例 - http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

注意 - 这个答案假定_quantity实际上是一个int,并且整数溢出不是问题

答案 2 :(得分:0)

var aggregateList = 
    myList.GroupBy(i => i._name)
          .Select(g => new Sale
         {
             _name = g.Key, 
             _quantity = g.Sum(x => Convert.ToInt64(x._quantity)).ToString()
         })
         .ToList();