Autor Beitrag
sk-io
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: Mi 15.02.17 22:06 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 16.02.17 00:46 
Ich nehme mal an, du hast Objekte einer Klasse, die irgendwie so aussieht:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: 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.. codereview.stackexch...enode-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: stackoverflow.com/qu...to-hierarchical-list