如何使用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);