如何使用linq对包含深X级相同对象的子集合的对象集合使用与doc.Descendants()类似的功能?

最后一个嵌套集合包含需要获取的数据,所有其他父集合仅仅是分组。我可以将集合转换为XDocument并调用后代函数,但我更喜欢针对此对象集合模拟该功能。

public class ProductLine
{
  public string Id {get;set;}
  public string ParentId  {get;set;}
  public string Name  {get;set;}
  public string Type  {get;set;}
  public string Level  {get;set;}
  public IEnumerable<ProductLine> Children  {get;set;}
}


我可以有一个ProductLine列表,其中包含ProductLine的子列表。嵌套级别取决于数据的设置方式,因此我不知道有多少级别。最底部的列表将具有Type =“ Model”,而每个之前的列表将具有Type =“ Series”,结果如下:

Series1
   Series2
      Series3
          Model1
          Model1
   Series2
      Model3
      Model4

最佳答案

使用此Node class,解决方案非常容易。
稍微更改ProductLineClass:

public class ProductLine
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    // The level property is no longer needed because it is a property of the Node class
    public IEnumerable<ProductLine> Children { get; set; }
}

创建一棵树:
var productlinesInAFlatList = GetListOfproductLines();

// Create alle the trees that can me made with the flad list based on Id and ParentId's
var rootNodes = Node<ProductLine>.CreateTree(productlinesInAFlatList, p => p.Id, p => p.ParentId);

// Assume there is only one tree in this flat ist
var rootNode = rootNodes.Single();

获取您需要的所有信息:
// Get the nodes that has no childnodes
var nodesWithoutChildNodes = rootNode.Descendants.Where(n => !n.Descendants.Any());

// If you just want the values of this childnodes
var values = nodesWithoutChildNodes.Values();

// When you need the levels of the values
var levels = nodesWithoutChildNodes.Select(n => n.Level);

10-01 06:13