删除对象C#列表中的重复项

时间:2014-10-21 13:04:48

标签: c# linq

我想比较一个对象列表的元素,删除重复的Item并增加该Item的数量(C#代码),我不知道我是否应该使用LinQ,For或foreach声明:我有一个OrderItem列表我想删除具有相同FK_ArtikelId的OrderItem并增加OrderItem的Qantity。 Exp:

for (int i=1 ; i < lot.Count   ; i ++)
{
    for (j = i + 1; j <= lot.Count; j++)
    {
        if (lot[i].FK_ArticleId.Equals(lot[j].FK_ArticleId))
        {
            lot[i].Quantity += lot[j].Quantity;
            lot.Remove(lot[j]);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您必须使用GroupBy linq方法并处理结果组:给定类

public class Article
{
    public int FK_ArticleId { get; set; }
    public int Quantity { get; set; }
}

以及以下列表:

var list = new List<Article>()
{
    new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 2, Quantity = 100}
    , new Article() {FK_ArticleId = 2, Quantity = 100}
    , new Article() {FK_ArticleId = 3, Quantity = 1000}
};

以下linq查询返回您需要的内容:

list.GroupBy(a => a.FK_ArticleId)
    .Select(g => new Article() {FK_ArticleId = g.Key, Quantity = g.Sum(a => a.Quantity)});

// article id 1, quantity 30
// article id 2, quantity 200
// article id 3, quantity 1000

如果您不想创建新文章,可以获取结果组中的第一个,并将其Quantity设置为正确的值:

var results = list.GroupBy(a => a.FK_ArticleId)
    .Select(g =>
    {
        var firstArticleOfGroup = g.First();
        firstArticleOfGroup.Quantity = g.Sum(a => a.Quantity);
        return firstArticleOfGroup;
    });

答案 1 :(得分:0)

我没有测试,但这应该让你知道linq的力量......

 var stuff  = lot
  .GroupBy(p => p.FK_ArticleId)
  .Select(g => g)
  .ToList();

这应该为您提供一组articleID,您可以轻松获取计数,创建新的合并列表等。

答案 2 :(得分:0)

对于初学者,您无法使用foreach,因为您正在修改列表,而Enumerator会抛出异常。您可以使用Linq执行以下操作:

var grouped = lot.GroupBy(x => x.FK_ArticleId).ToArray();
foreach(var group in grouped)
{
    group.First().Quantity = group.Sum(item => item.Quantity);
}

现在,每个组中的第一项将包含具有相同FK_ArticleId的所有项目数量的总和。现在,要获得结果,请使用:

var results = grouped.Select(g => g.First());

此时,您纯粹决定是将结果作为单独的集合返回还是将其插入原始列表中。如果您选择第二种方法,请不要忘记先清除列表:

list.Clear();
list.AddRange(results);

修改

Quantity属性累积到每个组的第一项中的更优雅的解决方案如下:

data.GroupBy(x=>x.FK_ArticleId)
    .Select(g => g.Aggregate((acc, item) => 
        {
             acc.Quantity = item.Quantity; 
             return acc;
        }));

这是我在LinqPad中取消的内容:

Results.