我还在学习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.
我知道如何总结所有项目,但我无法将特定项目的金额相加。提前感谢您的帮助
答案 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}");
}