C#合并两个列表,没有重复项并对字段值求和

时间:2014-01-08 12:13:01

标签: c# generics

我有一个具有 Id,Product,Quantity 属性的类。我已经创建了这个类的通用列表类型,并且一些项值相同(如下所示)。因此,我想合并相同的项目而不重复,但也将数量字段值汇总到一个项目中,并创建一个没有重复项的新通用列表,但数量字段值是总和。但无论如何我无法做到。

以下是代码:

class Program
{
    static void Main(string[] args)
    {
        Product p1 = new Product(1, "apple", 1);
        Product p2 = new Product(1, "apple", 1);
        Product p3 = new Product(1, "apple", 1);
        Product p4 = new Product(1, "apple", 1);
        Product p5 = new Product(2, "orange", 1);
        Product p6 = new Product(2, "orange", 1);
        Product p7 = new Product(3, "mango", 1);
        Product p8 = new Product(3, "mango", 1);
        Product p9 = new Product(3, "mango", 1);
        Product p10 = new Product(3, "mango", 1);

        List<Product> list = new List<Product>();
        list.Add(p1);
        list.Add(p2);
        list.Add(p3);
        list.Add(p4);
        list.Add(p5);
        list.Add(p6);
        list.Add(p7);
        list.Add(p8);
        list.Add(p9);
        list.Add(p10);

        var list_collapsed = Collapse(list);

        foreach (var item in list_collapsed)
        {
            Console.WriteLine("Id:{0} - Product: {1} - Quantity: {2}", item.Id, item.Name, item.Quantity);
        }

        Console.ReadKey();
    }

    public static List<Product> Collapse(List<Product> ExpandedList)
    {
        List<Product> CollapsedList = new List<Product>();

        for (int i = 0; i < ExpandedList.Count; i++)
        {
            if (CollapsedList.Count == 0)
            {
                CollapsedList.Add(ExpandedList[i]);
            }

            else
            {
                for (int j = 0; j < CollapsedList.Count; j++)
                {
                    if (ExpandedList[i].Id != CollapsedList[j].Id)
                    {
                        CollapsedList.Add(ExpandedList[i]);
                        break;
                    }

                    else
                    {
                        CollapsedList[j].Quantity += 1;
                        break;
                    }
                }
            }
        }

        return CollapsedList;
    }
}

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }

    public Product(int id, string name, int quantity)
    {
        this.Id = id;
        this.Name = name;
        this.Quantity = quantity;
    }
}

输出:

Id:1 - 产品:apple - 数量:3
Id:2 - 产品:橙色 - 数量:1
Id:2 - 产品:橙色 - 数量:1
Id:3 - 产品:芒果 - 数量:1
Id:3 - 产品:芒果 - 数量:1
Id:3 - 产品:芒果 - 数量:1
Id:3 - 产品:芒果 - 数量:1

但我需要输出如下:

Id:1 - 产品:apple - 数量:3
Id:2 - 产品:橙色 - 数量:2
Id:3 - 产品:芒果 - 数量:4

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:4)

是的,您可以使用Id字段进行GroupBy。然后在每个组中,您可以总结数量字段

 public static List<Product> Collapse(List<Product> ExpandedList)
 {
 List<Product> CollapsedList = new List<Product>();

 var groupBy = ExpandedList.GroupBy(x => x.Id);

 foreach (var group in groupBy)
 {
  var first = group.FirstOrDefault();
  first.Quantity = group.Sum(x => x.Quantity);
  CollapsedList.Add(first);
 }

 return CollapsedList;
 }

答案 1 :(得分:2)

你只需要这个小问题:

var list_collapsed = list
    .GroupBy(p => new { Id = p.Id, Name = p.Name } )
    .Select(g => new Product(g.Key.Id, g.Key.Name, g.Sum(p => p.Quantity)))
    .ToList();

答案 2 :(得分:0)

是的,linq是你的朋友:

var list_collapsed = products.GroupBy(p => p.Name).Select(g => new Product(0, p.Key, p.Sum(x => x.Quantity)).ToList();

答案 3 :(得分:0)

var list_collapsed = products.GroupBy(p => p.id).Select(g => new Product(Id = g.Key.Id,Name = g.Key.Name,Quantity = g.Sum(p => p.Quantity) ).ToList();

答案 4 :(得分:0)

试试这个:

        var newList = from p in list
                      group p by p.Id
                      into g
                      select new Product(g.Key, g.Min(f => f.Name), g.Sum(p => p.Quantity));