如何使用LINQ合并树(和总和计数)?

时间:2014-10-26 21:54:06

标签: c# linq tree

说我有这些课程:

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

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();

所以resultList<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()
        })
});