2014-01-08 41 views
0

我有一个类有Id,Product,Quantity属性。我创建了这个类的通用列表类型,并且一些项目的值是相同的(如下所示)。所以,我想合并相同的项目而不重复,但也可以将数量字段值合并为一个项目,并创建一个新的通用列表而不重复,但数量字段值为总和。但我无论如何也做不到。C#合并两个列表,没有重复和总计一个字段值

下面是代码:

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 - 产品:苹果 - 数量:3
ID:2 - 产品:橙色 - 数量:1
ID:2 - 产品:橙色 - 数量:1
ID:3 - 产品:芒果 - 数量:1
ID:3 - 产品:芒果 - 数量:1
ID:3 - 产品:芒果 - 数量:1
ID:3 - 产品:芒果 - 数量:1

但我需要它的输出喜欢这里:

ID:1 - 产品:苹果 - 产品数量:3
ID:2 - 产品:橙 - 数量:2
ID:3 - 产品:芒果 - 产品数量:4

谁能帮助我?

回答

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(); 
+0

谢谢Tim。它成功地为我工作。 –

3

是的,你可以使用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; 
} 
0

是,LINQ是你的朋友:

var list_collapsed = products.GroupBy(p => p.Name).Select(g => new Product(0, p.Key, p.Sum(x => x.Quantity)).ToList(); 
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();

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)); 
相关问题