我对C#比较新。我试图以下一种方式从列表中获取List:
模型数据:
string productId
string productName
string depotName
int quantity
List< Data > FullList
示例:
prod1 | product1 | depot1 | 1.00
prod1 | product1 | depot2 | 2.00
prod1 | product1 | depot3 | 0.00
prod2 | product2 | depot1 | 2.00
prod2 | product2 | depot2 | 5.00
在我得到这样的列表之后,我想以下一种方式再创建一个列表:
List< Data > NewList
prod1 | product1 | depot1,depot2 | 3.00
prod2 | product2 | depot1,depot2 | 7.00
我希望按product_id, sum(quantity)
对列表中的项目进行分组,并将多个站点名称串联起来。
我尝试达到某种程度(使用GroupBy(x => x.product_id)
和Distinct()
分组和获取不同的值,但我无法获得sum(quantity)
。
有人可以帮助我。
非常感谢你。
答案 0 :(得分:0)
var summary = FullList
.GroupBy(p => p.product_id)
.Select(g => new {
product_id = g.product_id,
product_name = g.First().product_name,
quantity = g.Sum(p => p.quantity)
})
.ToList();
作为练习考虑获取所有仓库名称的Concat。
答案 1 :(得分:0)
更新:
此实现不使用linq,但它可以正常工作。不确定访问大量数据时的性能有多好,
代码背后:
List<Data> data = new List<Data>()
{
new Data() { productId = "prod1", productName = "product1", depotName = "depot1", quantity = 1 },
new Data() { productId = "prod1", productName = "product1", depotName = "depot2", quantity = 2 },
new Data() { productId = "prod1", productName = "product1", depotName = "depot3", quantity = 0 },
new Data() { productId = "prod2", productName = "product2", depotName = "depot1", quantity = 2 },
new Data() { productId = "prod2", productName = "product2", depotName = "depot2", quantity = 5 },
};
List<Data> newData = new List<Data>();
foreach(var d in data)
{
Data newDataRecord = newData.FirstOrDefault(nd => nd.productId == d.productId);
if (newDataRecord != null)
{
int newDataRecordIndex = newData.IndexOf(newDataRecord);
if(!newDataRecord.depotName.Contains(d.depotName))
{
newData[newDataRecordIndex].depotName += string.Format(",{0}", d.depotName); // Append to the existing depotName
}
newData[newDataRecordIndex].quantity += d.quantity; // Add quantity
}
else
{
newData.Add(d);
}
}
型号:
public class Data
{
public string productId { get; set; }
public string productName { get; set; }
public string depotName { get; set; }
public int quantity { get; set; }
}
输出:
prod1 | product1 | depot1,depot2,depot3 | 3.00
prod2 | product2 | depot1,depot2 | 7.00