说我有这些课程:
public class Option
{
public int OptionID { get; set; }
public bool IsSelected { get; set; }
}
public class Product
{
public int ProductID { get; set; }
public int Quantity { get; set; }
public List<Option> Options { get; set; }
}
假设在Product
List<Product>
个对象后,这将是我的结果
2x Product 1
OptionID 1
OptionID 1
OptionID 2
OptionID 2
2x Product 1
OptionID 1
OptionID 1
OptionID 2
OptionID 2
如何使用LINQ(lambda)将这些结果转换为单个结果,其中IsSelected = true
?
4x Product 1
4x OptionID 1
4x OptionID 2
答案 0 :(得分:2)
如果我理解你的问题,这是非常典型的GroupBy
:
var result = data.GroupBy(x => x.ProductID,
(key, values) => new Product()
{
ProductID = key,
Quantity = values.Sum(p => p.Quantity),
Options = values.SelectMany(p => p.Options).ToList()
}).ToList();
所以result
是List<Product>
,其中包含与ProductID
合并的产品。
答案 1 :(得分:1)
虽然康拉德的答案很接近,但它并没有提供你想要的东西。它需要使用匿名类型和两个组。
这是一个小提琴:https://dotnetfiddle.net/v907me及其最相关的代码。
var query = products.GroupBy(p => p.ProductID, (key, values) => new
{
ProductID = key,
Quantity = values.Sum(v => v.Quantity),
Options = values
.SelectMany(v => v.Options.Where(o => o.IsSelected))
.GroupBy(o => o.OptionID, (k, v) => new
{
OptionID = k,
Quantity = v.Count()
})
});