我有一个具有 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
任何人都可以帮助我吗?
答案 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));