2011-12-08 8 views
0

i ont les données suivantesdonnées de chemin à arbre comme la structure de données

root 
root/blue 
root/blue/temp 
root/main 
root/main/dev 
root/main/back 
root/etc/init 
root/etc/init/dev 
root/etc/init/test 
root/etc/init/back 
root/etc/init/server 
root/etc/init/system 
root/etc/init/setup 
root/system 
root/system/temp1 
root/system/temp2 
root/system/temp3 
root/system/temp4 
root/system/temp5 
root/system/temp5/dev1 
root/rel 
root/intel/archival 
root/intel/archival/newsreel 
root/intel/archival/recording 

je voudrais être en mesure d'utiliser la classe soit DataBind à un contrôle d'arborescence (ASP.Net) ou générer un UL/Li pour la consommation de jquery.

Je dois le convertir en une classe List qui renverra la hiérarchie appropriée. J'ai essayé de nombreuses approches différentes jusqu'à présent, et je ne suis pas en mesure de trouver une solution. Je suis coincé. J'ai essayé de demander dans un post précédent, mais la solution n'a pas fonctionné, après de nombreuses tentatives pour en modifier certains, il ne fonctionne tout simplement pas. J'espère que l'un d'entre vous pourra m'aider.

Aussi ce n'est pas une simple fonction de partage, je sais comment séparer une chaîne.

Nous vous remercions à l'avance

+0

J'ai essayé http://stackoverflow.com/questions/6945216/converting-flattened-hierarchical-data-from-sql-server-into-a-structured-json-ob – Vince

+0

mon post précédent http: // stackoverflow. com/questions/8421822/hierarchy-from-char-délimité-string – Vince

Répondre

2

Voici une solution qui génère un dictionnaire récursives d'éléments NodeEntry:

public class NodeEntry 
{ 
    public NodeEntry() 
    { 
     this.Children = new NodeEntryCollection(); 
    } 

    public string Key { get; set; } 
    public NodeEntryCollection Children { get; set; } 

} 

public class NodeEntryCollection : Dictionary<string, NodeEntry> 
{ 
    public void AddEntry(string sEntry, int wBegIndex) 
    { 
     if (wBegIndex < sEntry.Length) 
     { 
      string sKey; 
      int wEndIndex; 

      wEndIndex = sEntry.IndexOf("/", wBegIndex); 
      if (wEndIndex == -1) 
      { 
       wEndIndex = sEntry.Length; 
      } 
      sKey = sEntry.Substring(wBegIndex, wEndIndex - wBegIndex); 
      if (!string.IsNullOrEmpty(sKey)) { 
       NodeEntry oItem; 

       if (this.ContainsKey(sKey)) { 
        oItem = this[sKey]; 
       } else { 
        oItem = new NodeEntry(); 
        oItem.Key = sKey; 
        this.Add(sKey, oItem); 
       } 
       // Now add the rest to the new item's children 
       oItem.Children.AddEntry(sEntry, wEndIndex + 1); 
      } 
     } 
    } 
} 

Pour utiliser ce qui précède, créer une nouvelle collection:

 NodeEntryCollection cItems = new NodeEntryCollection(); 

puis , pour chaque ligne de votre liste:

 cItems.AddEntry(sLine, 0); 
+0

merci je vais essayer ça tout de suite. – Vince

+0

La réponse parfaite, merci beaucoup – Vince

+0

se demander si je pourrais vous déranger une fois de plus, et voir s'il y a un moyen d'inclure également un compte avec le dictionnaire? Supposons qu'il y ait un compte de fichiers pour chaque ligne, avec quelle facilité pourrait-il être ajouté au dictionnaire ?? – Vince