【问题标题】:Aggregate List Based on Child Properties基于子属性的聚合列表
【发布时间】:2014-04-17 17:27:25
【问题描述】:

我有一个类结构来表示一个项目的材料列表,每种材料都有一个附加属性列表。类似于以下内容:

  • MaterialList
    • MaterialPiece
      • AdditionalPropertyList
        • AdditionalProperties

每个类都有一个ChildPieces list 属性,其中包含下一层的项目列表;例如,MaterialList 类有

public List<MaterialPiece> ChildPieces {get;set;}

所以这个例子可能是

  • 轮组
    • 轮子
      • 车轮属性
        • 数量:1
        • 部件号:R1000
    • 轮子
      • 车轮属性
        • 数量:1
        • 部件号:R1000

我想要做的是聚合 MaterialList 以根据 MaterialPiece 对象的某些属性(上例中的 Partnumber)将它们组合在一起。

这会导致

  • 轮组
    • 轮子
      • 车轮属性
        • 数量:2
        • 部件号:R1000

我想在最外层的对象中做这个,即我想实现

class MaterialList : BasePiece
{
    public void AggregateMaterialPieces()
    {
        var newList = ChildPieces.Where(...)
    }
}

所以我的问题是:我可以使用 LINQ 根据 AdditionalPropertyList 中的一些已知值对 MaterialList 中的 MaterialPieces 进行分组和求和吗?

【问题讨论】:

  • 这听起来像是... SelectMany-Man 的工作!像ChildPieces.SelectMany(piece =&gt; piece.AdditionalPropertyList) 这样的东西会给你一个集合,其中包含每个附加属性列表包含的所有项目。不确定这是否是一个完整的答案,但这应该是一个有用的步骤。
  • @Magus - 这会让我不把结构弄平吗?即,我仍然想要一个离散的 MaterialPiece 对象列表,但按 AdditionalProperties 条目之一分组,并在另一个上求和。
  • @Geoff 你可以做扁平化结构,然后根据需要分组
  • Linq 有 Select 如果你不想弄平东西,还有 GroupBy 等等。你有选择。
  • @Magus - 谢谢,我正在使用基于this answer 的 Select 和 Sum,但我一直在努力弄清楚如何使它与我所拥有的嵌套结构一起工作(因此我的问题)。

标签: c# linq


【解决方案1】:

您的问题不够具体,但无论如何,这里有一些代码可以为您提供每个零件编号的数量。

 var groupings = list.SelectMany(x => x.AdditionalPropertyList).GroupBy(x => x.PartNumber).Select(g => new { PartNumber=g.Key, Quantity=g.Sum(x => x.Quantity) } );

 foreach (var g in groupings)
    Console.WriteLine("PartNumer: {0} Total: {1}", g.PartNumber, g.Quantity);

我不肯定这是正确的,如果它不起作用,请告诉我,我会尽量腾出时间来实际测试它。基本思想是将列表展平为所有其他属性,然后按零件编号对它们进行分组,然后为每个分组创建一个新的匿名对象,该对象使用零件编号(组键)并在分组列表上调用聚合得到所有数量的总和。

【讨论】:

  • 谢谢!首先,如果您能描述我所缺少的内容,我很高兴能更具体一点?我开始明白,要执行GroupBy,我需要有效地销毁(即省略)旧的子对象并创建一个新的聚合对象,但让我感到困惑的部分是子对象下方有两个级别。在我的示例中,我猜我省略了两个 Wheel 对象并创建了一个具有聚合数量的新 Wheel,但是如何在 LINQ 中创建这些额外的级别?还是我最好另辟蹊径?
  • @Geoff 是的,我的代码不太好用,但会摆脱那些其他级别,所以你只有一个对象列表,其中每个对象都有一个 PartNumber 和该 partnumber 的总量。我不知道该怎么做,我认为分解成多个 LINQ 查询可能更简单。
  • @Geoff 我修复了我的代码,因为它现在可以执行我想要的操作,不一定是您要查找的内容,但可能与您将要获得的内容差不多。至少这一切都是一个 LINQ 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多