Sum使用Linq的对象列表

时间:2013-10-02 16:03:21

标签: c# linq

我有一个班级:

public Class MyClass
{
  public string name {get;set;}
  public double quantity {get; set;}
  public double price {get; set;}
  public double value {get; set;}
  public string id1 {get; set;}
  public string id2 {get; set;}
}


List<MyClass> myList = new List<MyClass>();

然后填充列表对象,但同名可以有多个条目。例如,这是我的列表概述:

[0] "stock A", 200.0, 20.0, 4000, "aa", "bb"
[1] "stock A", 400.0, 20.0, 8000, "aa", "bb"
[2] "stock B", 200.0, 20.0, 4000, "cc", "dd"
[3] "stock A", 200.0, 19, 3800, "aa", "bb"
[4] "stock C", 200.0, 20.0, 4000, "ee", "ff"

目前我有以下代码:

var groupedStockList = (from t in myList
  group t by new { t.name, t.price }
    into grp
    select new
    {
      grp.Key.name,
      grp.Key.price,

      Quantity = grp.Sum(x => x.quantity)
    }).ToList();

结果是,股票A被分组,但是2组价格为2组,所以我有一个600股票A的股票,价格为20和200股票,价格为19。

我原以为我必须按平均价格计算,即sum = (quantity * price) / total_quantity但是因为如何将其纳入linq而丢失了。

有没有人对此有所帮助,可以帮忙吗?我想在列表中保留ID 1和2,只是按名称排序。

感谢。

修改

我想回来的是这个,

[0] "stock A", 800, 19.75, 15800, "aa", "bb"
[1] "stock B", 200.0, 20.0, 4000, "cc", "dd"
[2] "stock C", 200.0, 20.0, 4000, "ee", "ff"

2 个答案:

答案 0 :(得分:5)

试试这个

var groupedStockList = (from t in myList
    group t by new { t.name, t.id1, t.id2 } into grp
    select new
    {
      Name = grp.Key.name,
      TotalQuantity = grp.Sum(x => x.quantity),
      AvgPrice = grp.Sum(x => x.value) / grp.Sum(x => x.quantity),
      TotalValue = grp.Sum(x => x.value),
      Id1 = grp.Key.id1,
      Id2 = grp.Key.id2     
    }).ToList();

答案 1 :(得分:0)

值得一提的是使用方法语法修改this other answer而不是查询语法

var result = myList.GroupBy(x => {x.name, x.id1, x.id2})
                   .Select(g => new {
                                         Name = grp.Key.name,
                                         TotalQuantity = grp.Sum(x => x.quantity),
                                         AvgPrice = grp.Average(x => x.price),
                                         TotalValue = grp.Sum(x => x.value),
                                         Id1 = grp.Key.id1,
                                         Id2 = grp.Key.id2     
                                     })
                   .ToList();