Linq group by Sum,如果sum为null,则返回0

时间:2015-01-24 14:27:15

标签: c# linq group-by

我有以下类型:

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,这可能吗?

由于

3 个答案:

答案 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确保每个名称至少有一个项目,并且该项目的总数为零。在某种程度上,添加的项目充当“哨兵”:如果项目名称存在,它们没有区别,但如果名称不存在,则它们确保将具有零的行添加到结果中。