【问题标题】:How to merge trees (and sum counts) using LINQ?如何使用 LINQ 合并树(和总数)?
【发布时间】:2014-10-26 21:54:06
【问题描述】:

假设我有这些课程:

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&lt;Product&gt; 后的结果

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

【问题讨论】:

  • 您当前的ChartItems 课程无法实现您的最终目标。
  • 在您的ChartItems 类中,Quantity 代表ProductOption 的数量吗?
  • 在您的ChartItems 类中,List&lt;int&gt; OptionID 只是所有选定OptionID 值的列表。
  • -1 如果您在两个人提供了很好的答案后更改了您的问题,那么最好将其中一个答案标记为您原始问题的正确答案,然后再提出一个新问题。

标签: c# linq tree


【解决方案1】:

如果我正确理解你的问题,这是很典型的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&lt;Product&gt;,包含与ProductID 合并的产品。

【讨论】:

    【解决方案2】:

    虽然 Konrad 的答案很接近,但它并不能完全满足您的需求。它需要使用匿名类型和两个组。

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

    【讨论】:

    • @DeMama 虽然我能够添加IsSelected 过滤器,但我不确定您将结果移植到ChartItems 类中的要求是什么。你的那部分问题对我来说是不透明的。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多