在一个列表中汇总相同的项目

时间:2017-11-08 03:05:11

标签: c#

我还在学习C#,我对列表有疑问。我试图用list编写代码。这是我的代码

List<Item> itemList = new List<Item>();

itemList.Add(new Item { ItemID = (int)itemID, ItemQty = (decimal) itemQty });

这是列表的输入

index  Item ID & Amount
-------------------------
0      0001         20
1      0002         10
2      0001         30
3      0003         40

我想要做的是获取每个ID的总金额。对于这种情况,项目0001的总量是50.

我知道如何总结所有项目,但我无法将特定项目的金额相加。提前感谢您的帮助

2 个答案:

答案 0 :(得分:3)

我在评论中发布了这个内容,但正如艾哈迈德建议的那样,更容易解释/详细解释;)

您可以将LINQ的GroupBy()Sum()一起使用,如下所示(请记住using System.Linq;

var grouped = itemList.GroupBy(i => i.ItemId).Select(i => new { ItemId=i.Key, Total=i.Sum(item => item.ItemQty) });

基于ItemIds的上述行组itemList,然后使用ItemId和ItemQty(Total)的总和创建一个新的anonymous type

稍后,要获取特定ID的总计,您可以执行以下操作:

var sumForId1 = grouped.Where(g => g.ItemId == 1).Select(g => g.Total).Single();

编辑以添加替代方案:

正如Ahmad在评论中所建议的那样,另一种方法(更快地查找涉及大型列表的方法)是使用ToDictionary<>创建Dictionary,如下所示:

var grouped = itemList.GroupBy(i => i.ItemID).ToDictionary(i => i.Key, i => i.Sum(item => item.ItemQty));      
//doesn't matter if ItemID is string or int here

var sumForId1 = grouped[1];     //or if ItemID is string, grouped["1"]

答案 1 :(得分:-1)

如果我们有一个班级

class Item
{
    public int ItemID;
    public decimal ItemQty;
}

然后这是一种可能的解决方案

void Main()
{
    List<Item> itemList = new List<Item>();

    itemList.Add(new Item { ItemID = 1, ItemQty = 20m });
    itemList.Add(new Item { ItemID = 2, ItemQty = 10m });
    itemList.Add(new Item { ItemID = 1, ItemQty = 30m });
    itemList.Add(new Item { ItemID = 3, ItemQty = 40m });

    var itemGroup = itemList.GroupBy(i => i.ItemID).Select(g => new { ItemID = g.Key, TotalQty = g.Select(j => j.ItemQty).Sum() });
    foreach (var i in itemGroup)
        Console.WriteLine($"{i.ItemID}: {i.TotalQty}");
}