使用多列进行分组,然后使用方法语法对特定列求和

时间:2019-08-07 14:32:28

标签: c# linq enumerable

当前,我正在寻找一种方法,该方法可从枚举中获取所有计件的总和,而忽略重复项,而所有这些都使用方法语法。到目前为止,我的代码可以正常工作,但是我意识到这只是暂时的。稍后会对此进行更多介绍。

让我们以以下类为例

internal class Piece
{
    public int Count { get; set; }
    public DateTime Date { get; set; }
    public string Description { get; set; }   
}

该类随后用于创建具有以下信息的列表

List<Piece> pieces = new List<Piece>
{
    new Piece(41,DateTime.Parse("2019-07-12"),"BB"),
    new Piece(41,DateTime.Parse("2019-07-12"),"BB"),
    new Piece(21,DateTime.Parse("2019-07-12"),"JP"),
    new Piece(23,DateTime.Parse("2019-07-14"),"AA")
};

为求和,我想出了以下内容

int total = pieces.Where(x => x.Count > 0)
                  .GroupBy(x => x.Count, x => x.Date, 
                           (piece, date) => new { Count = piece,Date = date})
                  .Sum(x => x.Count);

这是棘手的地方。如果要添加其他内容,如下所示

new Piece(23,DateTime.Parse("2019-07-14"),"AB") 

由于我的分组方式,该作品将被忽略。这远非理想。

我发现以下几种按几列分组的方法

GroupBy( x => new {x.Count,x.Date,x.Description})

但是我没有找到方法,因此可以在此分组中使用Sum。据我所知,使用AnonymousType进行分组不能像在先前的(piece,date)中那样声明局部变量GroupBy。 现在,我拥有的代码可以解决问题,但是不再是时间问题了。

一些额外的细节。

我正在使用Razor处理查询结果,但是我无法控制从服务器获取的数据。使用linq操纵数据基本上是我目前唯一的方法。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

对于计数,您只需要以下查询:

int total = pieces
    .Where(x => x.Count > 0)
    .GroupBy(x => new { x.Count, x.Date, x.Description })
    .Sum(g => g.Key.Count);

因此您可以访问分组的所有关键属性。

这将为您的初始样本返回85,如果添加新样本,则返回108。