为列表中每个相同的其他列汇总列中的值的总和

时间:2014-09-16 18:23:18

标签: c# linq list

我正在处理我自己定义的C# list类型,它有大约6列和几行数据,我正在尝试检索三列中包含相同数据的数据和其他列的总和与类似数据相关联。

例如,我的C# list包含以下数据

Time    Code Range  Unit   Type   Price Volume 
8:13:43 LN  N15-U15 300     Put   0.1   250
8:13:53 LN  N15-U15 300     Put   0.1   50
8:14:01 LN  N15-U15 300     Put   0.099 100
8:14:08 LN  N15-U15 300     Put   0.099 50
8:16:49 LN  V14     380/400 Call  0.063 50
8:17:04 LN  V14     380/400 Call  0.001 50
8:18:43 LN  N15-U15 450     Call  0.125 50
8:34:00 LN  F15      500    Call  0.053 200

从上面的数据我想为所有相似列的每个相似代码,范围,单位和类型以及卷的总和检索一行,并将其存储到另一个C#列表所以,我希望新列的四列为如下

Code Range  Unit   Type  Volume
LN  N15-U15 300     Put   450 
LN  V14     380/400 Call  100

以上两行是唯一具有相似Code,Range, Unit and Type and Volume的行是类似其他列的所有卷的总和

我能够成功检索到类似的行但无法获得卷的总和 我有以下linq代码

var result = from row in listStructures
                         group row by new { row.Code, row.range, row.Unit, row.Type} into grp
                         let Item = grp.First()                        
                         select new { Code= Item.Code, Range= Item.Range, Unit= Item.unit, Type= Item.type};

            listMicroSummary = new List<StructuresDS>();
            listMicroSummary.Add(new StructuresDS
            {
                Code= result.Select(x=>x.Code).ToString(),
                Range=result.Select(x=>x.Range).ToString(),
                Unit= result.Select(x => x.Unit).ToString(),
                Type= result.Select(x => x.Type).ToString(),
            });

我有更好的方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

我相信你在寻找:

var query = listStructures.GroupBy(row => new {row.Code, row.range, row.Unit, row.Type} )
                     .Select(grp => new StructuresDS
                     {
                         Code = grp.Key.Code,
                         Range = grp.Key.Range,
                         Unit = grp.Key.Unit,
                         Type = grp.Key.Type,
                         Volumne = grp.Sum(r=> r.Volume)
                     });
listMicroSummary = query.ToList();// if you want a List
  • 您不需要grp.First(),因为您将所有字段都作为一部分 of Key。
  • 使用Enumerable.Sum对每个组的音量求和。