C#在LINQ中使用某些字段的总和进行分组

时间:2017-10-30 14:42:51

标签: c# linq

我有多个文件,其中的字段大多相同。只有两个不同的字段是PriceQuantity。我想创建一个IEnumerable(),其中包含与每个分组匹配的第一个项目,但价格和数量字段已替换为此分组中所有其他匹配项目中的sum()

fieldone   fieldtwo   fieldthree   price   quantity
a1         b1         c1           3       5
a1         b1         c1           13      15
a1         b1         c1           23      25
a2         b2         c2           4       7
a2         b2         c2           14      17

应该返回:

fieldone   fieldtwo   fieldthree   price   quantity
a1         b1         c1           39      45
a2         b2         c2           18      24

我一直在关注GroupBy()例如:

var groupedResults = results.GroupBy(a => new { 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree}
)

但我不知道如何使用它来获得我想要的结果。

3 个答案:

答案 0 :(得分:2)

您需要预测您的小组以汇总必填字段

var groupedResults = results.GroupBy(a => new { 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree}
).Select(g => new {
    g.Key.FieldOne,
    g.Key.FieldTwo,
    g.Key.FieldThree,
    Price = g.Sum(x => x.Price),
    Quantity = g.Sum(x => x.Quantity)
});

还有另一个重载,您可以为GroupBy提供第二个参数以获得结果,这可以节省Select之后的第二个GroupBy链接,但我个人更喜欢上述方法。

答案 1 :(得分:2)

您需要使用包含结果选择器的重载。

var groupedResults = results.GroupBy(a => new 
{ 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree
}, 
(key, items) => new 
{ 
    key.FieldOne,
    key.FieldTwo,
    key.FieldThree,
    Price = items.Sum(a => a.Price), 
    Quantity = items.Sum(a => a.Quantity) 
});

答案 2 :(得分:0)

您可以测试一下:

var result = Db.Entity
       .GroupBy(p=>new {x.fieldone, x.fiedltwo, x.fieldthree})
       .Select(p=> new { 
             fieldone = p.fieldone, 
             fieldtwo = p.fiedltwo, 
             fieldthree = p.fieldthree, 
             price = p.Sum(x=>x.price), 
             quantity = p.Sum(x=>x.quantity)}).ToList();