2016-11-28 5 views
4

У меня проблема с созданием дерева из списка списка строк. Вот мои входные данные:создать дерево из списка списка C#

IReadOnlyList<IReadOnlyList<string>> listeDesParcours = new List<IReadOnlyList<string>> 
    { 
     new List<string> 
     { 
      "Produit","Sinistre","Particulier","Auto","RC" 
     }, 
     new List<string> 
     { 
      "Produit","Sinistre","Entreprise","Auto","2roues" 
     }, 
     new List<string> 
     { 
      "Produit","reclamation","Particulier","Moto","PP" 
     }, 
     new List<string> 
     { 
      "Produit","reclamation","Entreprise","Auto","TT" 
     }, 
     new List<string> 
     { 
      "Produit","reclamation","Entreprise","Auto","PP" 
     }, 
     new List<string> 
     { 
      "Produit","souscription","Salarie","Aviation" 
     }, 
     new List<string> 
     { 
      "Produit","souscription","Salarie","Aviation","Airbus" 
     }, 
     new List<string> 
     { 
      "Produit","reclamation","Reclamation tout court" 
     }, 
     new List<string> 
     { 
      "Produit","Produit tout court" 
     }, 
     new List<string> 
     { 
      "Produit","Sinistre","Entreprise","Auto","5roues" 
     } 
    }; 

Как вы можете видеть, его список список строки и я хочу, чтобы получить дерево от него . вот мой объект, который я хочу, чтобы вернуться в конце

public class Node 
     { 
      public string Value { get; set; } 
      public List<Node> Childs { get; set; } 
     } 

и это, как я хочу, чтобы получить структуру

        RootElement 
             | 
     ___________________________Produit__________________________ 
    /       |        \ 
__sinistre___________   reclamation_______     Souscription 
|     \    /   \      |   
entreprise  particulier  entreprise particulier   Salarie______________ 
    |    |    |   |      |    \ 
    auto   auto    auto  auto     Marine    Aviation__ 
                          / \ 
                          Airbus Boing 

Может кто-нибудь указать мне, пожалуйста, на рекурсивный метод, который позволяет мне заполните дерево из списка списка, пожалуйста?

Заранее спасибо

EDIT: После последнего комментария я хочу пояснить, что я хочу, чтобы получить объект типа Node, который я создал ... Однако мой Input список списка строки

+0

привет! Можете ли вы принять нерекурсивный метод, если он решает вашу проблему? –

+0

@KarouiHaythem да, если я могу получить объект, как описано, конечно, было бы здорово! :) – Ytem

+0

Я не совсем понял, если вы хотите использовать свою собственную структуру или хотите использовать стандартный список списков –

ответ

1
var root = new Node() { Value = "RootElement", Childs = new List<Node>() }; 
    foreach (var route in listeDesParcours) 
    { 
     var current = root; 
     foreach (var value in route) 
     { 
      var child = current.Childs.Find(x => x.Value == value); 
      if (child == null) 
      { 
       child = new Node() { Value = value, Childs = new List<Node>() }; 
       current.Childs.Add(child); 
      } 
      current = child; 
     } 
    } 

Обратите внимание, что есть какая-то разница между данными в listeDesParcours и нарисованного дерева, так что в результате дерево root не выглядит точно как ваш.

0
  1. Создайте rootNode, который будет возвращен.

  2. Написать функцию, как populateRootNode(Node rootNode, IReadOnlyList> input)

    В этой функции, создавать узлы для каждого списка, надстройка упаковали узлы детей RootNode. И вызовите addChildrenNodes (см. 3) для каждого списка.

  3. Напишите функцию, аналогичную addChildrenNodes(Node ParentNode, List input).

    В этой функции создайте узлы для каждого элемента данного списка и добавьте созданные узлы в качестве дочерних узлов текущего узла.

  4. Верните RootNode

+0

Это не рекурсивный метод, поскольку вход не является деревом единых узлов. –

Смежные вопросы