在List中一起添加重复项

时间:2016-06-28 16:14:40

标签: c# list duplicates ienumerable

第一个问题:)

我有一个List<Materiau>(其中Materiau实现IComparable<Materiau>),我想删除所有重复项并将它们添加到一起 (如果两个Materiau相同(使用比较器),将其合并到第一个并从列表中删除第二个)

Materiau包含ID和数量,当我使用Materiau+=合并两个+时,它会保留相同的ID,并添加数量< / p>

我无法控制列表的输入。

我想要这样的事情:

List<Materiau> materiaux = getList().mergeDuplicates();

感谢您的时间:)

3 个答案:

答案 0 :(得分:2)

查看Linq!特别是GroupBy方法。

我不知道你对sql的熟悉程度,但是Linq让你可以像sql的工作方式一样查询集合。

有点深入解释你是完全陌生的,但Code Project有一个很好的例子

总结一下:

想象一下,我们有这个

List<Product> prodList = new List<Product>
{
    new Product
    {
        ID = 1,
        Quantity = 1
    },
    new Product
    {
        ID = 2,
        Quantity = 2
    },
    new Product
    {
        ID = 3,
        Quantity = 7
    },
    new Product
    {
        ID = 4,
        Quantity = 3
    }
};

我们希望将所有重复的产品分组,并将其数量相加。

我们可以这样做:

var groupedProducts = prodList.GroupBy(item => item.ID) 

然后从分组中选择值,并根据需要使用聚合

var results = groupedProducts.Select( i => new Product
{ 
   ID = i.Key, // this is what we Grouped By above  
   Quantity = i.Sum(prod => prod.Quantity) // we want to sum up all the quantities in this grouping
});

和繁荣!我们有一个聚合产品列表

答案 1 :(得分:1)

假设你有一个班级

class Foo
{
  public int Id { get; set; }
  public int Value { get; set; }
}

以及列表中的一堆

var foocollection = new List<Foo> {
    new Foo { Id = 1, Value = 1, },
    new Foo { Id = 2, Value = 1, },
    new Foo { Id = 2, Value = 1, },
};

然后你可以对它们进行分组并在每个组上构建聚合

var foogrouped = foocollection
    .GroupBy( f => f.Id )
    .Select( g => new Foo { Id = g.Key, Value = g.Aggregate( 0, ( a, f ) => a + f.Value ) } )
    .ToList();

答案 2 :(得分:-1)

List<Materiau> distinctList = getList().Distinct(EqualityComparer<Materiau>.Default).ToList();