我有以下类型:
class ItemTotals
{
public decimal Total { get; set; }
public string ItemType { get; set; }
}
我使用以下方法获取每个ItemType的总计:
var items = new List<ItemTotals>
{
new ItemTotals
{
Total = 10,
ItemType = "X"
},
new ItemTotals
{
Total = 10,
ItemType = "X"
},
new ItemTotals
{
Total = -5,
ItemType = "Y"
},
new ItemTotals
{
Total = -20,
ItemType = "Y"
}
};
List<ItemTotals> query = items.GroupBy(x => x.ItemType)
.Select(x => new ItemTotals
{
ItemType = x.Key,
Total = x.Sum(z => z.Total)
}).ToList();
这使得X总计为20,总Y为-25。但是假设如果所有项类型都是X,那么我只得到一个结果,总数为-5,对于X而且没有结果为Y,我想要为0,这可能吗?
由于
答案 0 :(得分:4)
在列表初始化
之后添加这些行items.Add(new ItemTotals {Total = 0, ItemType = "X"});
items.Add(new ItemTotals {Total = 0, ItemType = "Y"});
答案 1 :(得分:2)
您可以找到列表中未包含的类型,并将它们添加到循环中:
List<string> itemTypes = new List<string>() {"X", "Y", "Z"};
foreach(var type in itemTypes)
{
if(!items.Any(x => x.ItemType == type)
items.Add(new ItemTotals() {ItemType = type, Total = 0})
}
List<ItemTotals> query = items.GroupBy(x => x.ItemType)....
答案 2 :(得分:2)
一种方法是将与零配对的已知名称集合添加到集合中,如下所示:
var[] names = new {"X", "Y", "Z"};
List<ItemTotals> query = items
.Concat(names.Select(n => new ItemTotals {Total = 0, ItemType = n}))
.GroupBy(x => x.ItemType)
... // And so on
Concat
确保每个名称至少有一个项目,并且该项目的总数为零。在某种程度上,添加的项目充当“哨兵”:如果项目名称存在,它们没有区别,但如果名称不存在,则它们确保将具有零的行添加到结果中。