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 Th69: 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?
jfheins hat folgendes geschrieben : |
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(); 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!