Entwickler-Ecke

C# - Die Sprache - Daten hierarchisch sortieren


sk-io - Mi 15.02.17 22:06
Titel: Daten hierarchisch sortieren
Hallo erstmal,

Wenn ich wuesste wie man das problem anginge.. hilfe ist sehr gerne akzeptiert:

Ich habe einen Baum (Tree) der so aussieht:

Zitat:

MASTER
..|
..+-A
..|.|
..|.+-D
..|.|
..|.+-C
..|....|
..|....+-E
..+-B


I benutze eine ID (automatisch vom SQL) und eine ParentID die ich dem Child ein setze wie so:

Zitat:

Id PID Name
1 0 Master
2 1 A
14 1 B
15 2 C
13 2 D
16 15 E


Alles klappt gut. Doch moechte ich gerne den Baum exportieren und wenn moeglich korrekt anzeigen...

Kann mir jemand erklaeren wie ich dies in die korrekte order kann kriegen? Wie so:

Zitat:

1, 0, Master
2, 1, A
13,2, D
15,2, C
16,15,E
14,1,B


Mein Brain is ueberlasted :(

Vielen Dank im voraus :)

Moderiert von user profile iconTh69: Titel geändert (war "Sortieren?").


jfheins - Mi 15.02.17 23:26

Definiere doch bitte die gewünschte Reihenfolge genauer.
Insbesondere: Warum steht A vor B und D vor C?


sk-io - Do 16.02.17 00:06

Beide sowohl A und B als D und C koennten vertauscht werden. Da sie am selben Ast haengen ist es mir egal wer zuerst kommt.

Zitat:

Master
B
A
|-D
|-C
..|-E

Id PID Name
1 0 Master
2 1 A
14 1 B
15 2 C
13 2 D
16 15 E


Ich koennte nach PID sortieren... doch wie kriege ich den loop ther mir sagt wo wann welche reihe kommt?

Ich muss irgendwie sicher sein dass E unter C geschrieben wird. Da der User immer neue kinder in den Baum schreiben kann.

Ein foreach loop der sucht ob es ueber hunderte von PID's ein Kind hat?


user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Definiere doch bitte die gewünschte Reihenfolge genauer.
Insbesondere: Warum steht A vor B und D vor C?


jfheins - Do 16.02.17 00:46

Ich nehme mal an, du hast Objekte einer Klasse, die irgendwie so aussieht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
  class Node
  {
    public int ID { get; set; }
    public int ParentID { get; set; }
    public string Text { get; set; }
  }


In dem Fall würde ich dem noch eine Property "Children" spendieren und so ezwas in der Art programmieren:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
      public void TraverseNodes(IEnumerable<Node> nodes)
      {
        var nodeMap = nodes.ToDictionary(n => n.ID);
      var rootNode = ...;
        foreach (var n in nodeMap.Values)
          nodeMap[n.ParentID].Children.Add(n);

        var stack = new Stack<Tuple<Node, int>>();
      stack.Push(Tuple.Create(rootNode, 0));
        while (stack.Any())
        {
          var currentTuple = stack.Pop();
        // Print node with level
          foreach (var node in currentTuple.Item1.Children)
        {
          stack.Push(Tuple.Create(node, currentTuple.Item2+1));
        }
        }
      }

Mal so aus dem Kopf. Man könnte auch eine zweite Funktion rekursiv aufrufen, das wäre vll. eleganter.


sk-io - Do 16.02.17 01:07

Leider kann ich die Klasse nicht aendren da es eine DataClasse ist. Das war mein erster versuch, bloss ist es nicht erlaubt eine Linq to Sql dataclasse zu inheritieren.

Ich wusste nicht dass C# eine Stack classe hatte :)

Dein code ist mir im einiges voraus... Wenn es nicht zuviel der muehe waere wurde ich gerne auch ein exempel von einer rekursiven function sehen :oops:


EDIT: Habe gerade dieses Thema gefunden.. http://codereview.stackexchange.com/questions/5265/creating-a-treenode-hierarchy-in-c
Sieht versprechend aus... Wollte bloss ein kleines edit schreiben um dir Zeit zu sparen falls dies mir helfen kann.
EDIT2: Naturlich verstehe ich kein Wort :shock:
EDIT3: Getting warmer: http://stackoverflow.com/questions/9409021/id-parentid-list-to-hierarchical-list