C# 基于子属性的聚合列表

C# 基于子属性的聚合列表,c#,linq,C#,Linq,我有一个类结构,表示一个项目的材质列表,每个材质都有一个附加属性列表。与以下内容类似: MaterialList 材料件 AdditionalPropertyList 附加属性 每个类都有一个ChildPieceslist属性,其中包含下一级别的项目列表;例如,MaterialList类 public List<MaterialPiece> ChildPieces {get;set;} 所以我的问题是:我可以使用LINQ根据AdditionalPropertyLis

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

  • MaterialList
    • 材料件
      • AdditionalPropertyList
        • 附加属性
每个类都有一个
ChildPieces
list属性,其中包含下一级别的项目列表;例如,
MaterialList

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

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

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

 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(分组键)并调用分组列表上的聚合以获得所有数量的总和。

这听起来像是<代码>选择多个-男人!类似于
ChildPieces.SelectMany(piece=>piece.AdditionalPropertyList)
的内容将为您提供一个集合,其中包含每个附加属性列表包含的所有项。不确定这是否是一个完整的答案,但这应该是一个有用的步骤。@Magus-这能让我不把结构弄平吗?i、 e.我仍然需要一个离散的
materialpice
对象列表,但要按一个
AdditionalProperties
条目进行分组,然后在另一个条目上求和。@杰夫你可以做展平结构,然后根据你的意愿进行分组
如果你不想展平事物,请选择
,以及
GroupBy
等等。你有选择。@Magus-谢谢,我使用的是基于的选择和求和,但我一直在努力弄清楚如何使它与我现有的嵌套结构(因此我的问题)一起工作。谢谢!首先,如果你能描述一下我遗漏了什么,我很高兴能说得更具体一些?我开始明白,要做一个
GroupBy
,我需要有效地销毁(即省略)旧的子对象并创建一个新的聚合对象,但让我感到困惑的是,子对象下面有两层。在我的示例中,我猜我省略了两个轮子对象,并创建了一个具有聚合数量的新轮子,但是如何在LINQ中创建这些附加级别呢?还是我最好换一种方式?@Geoff是的,我的代码不太管用,但会去掉那些其他级别,所以你只需要一个对象列表,其中每个对象都有一个PartNumber和该PartNumber的总量。我不知道如何做你想做的事情,我认为分解成多个LINQ查询可能更简单。@Geoff我修复了我的代码,因为它现在做我想做的事情,不一定是你想做的事情,但可能是你想做的事情。至少所有这些都是一个LINQ查询。
 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);