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

本文关键字:何使用 LINQ 合并 | 更新日期: 2023-09-27 18:27:58

假设我有这些类:

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; }
}

假设这是我在List<Product>中添加一些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

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

如果我正确理解您的问题,这是非常典型的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是一个包含与ProductID合并的产品的List<Product>

虽然康拉德的答案很接近,但它并没有完全提供你想要的东西。它需要使用匿名类型和两个组。

这里有一个小提琴: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()
        })
});