我有一个班级:
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"
答案 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();