基于子属性的聚合列表

时间:2014-04-17 17:27:25

标签: c# linq

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

  • MaterialList
    • MaterialPiece
      • AdditionalPropertyList
        • AdditionalProperties

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

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

所以这个例子可能是

    • 轮式
      • 轮子属性
        • 数量:1
        • Partnumber:R1000
    • 轮式
      • 轮子属性
        • 数量:1
        • Partnumber:R1000

我想要做的是聚合MaterialList,将MaterialPiece对象基于它们的一些属性组合在一起 - 上例中的Partnumber。

这会导致

    • 轮式
      • 轮子属性
        • 数量:2
        • Partnumber:R1000

我想在最外面的对象中执行此操作,即我想实现

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

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

1 个答案:

答案 0 :(得分:0)

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

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

我不肯定这是正确的,如果它没有工作让我知道,我会尽量抽出时间来实际测试它。基本思想是将列表展平为所有其他属性,然后按partnumber对这些属性进行分组,然后为每个分组创建一个新的匿名对象,该对象使用partnumber(组密钥)并在分组列表上调用aggregate得到所有数量的总和。