Linq to xml потомков - PullRequest
       30

Linq to xml потомков

3 голосов
/ 17 декабря 2010

Как я могу получить функциональность, аналогичную doc.Descendants (), используя linq для коллекции объектов, которая содержит вложенные коллекции с одинаковыми объектами глубиной X уровней?

Последняя вложенная коллекция содержит данные, которые необходимо получить, все остальные родительские коллекции являются просто группировками. Я мог бы преобразовать коллекцию в 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

Ответы [ 2 ]

2 голосов
/ 01 августа 2013

С этим классом узла решение довольно просто.

Измените 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);
0 голосов
/ 21 марта 2013

Вы можете использовать функцию Линка SelectMany.

IEnumerable<ProductLine> products = <something>;
IEnumerable<ProductLine> modelProducts = products
    .SelectMany((x) => x.Children)

Однако это сгладит только одну глубину.Вам нужно искать Recursive SelectMany для полного эффекта.Для получения дополнительной информации см. Следующие ссылки.

...