Laden...

Suche Datenstruktur für Bäume

Erstellt von DatMilu vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.095 Views
D
DatMilu Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren
Suche Datenstruktur für Bäume

Hallo Leute,

ich glaube die PHP-Welt hat mich zu einem bequemen Zottelmonster verwandelt xD
In C# habe ich ab und zu Probleme mit den Datentypen aber hoffentlich habt ihr ja eine lösung für mein jetziges Problem.

Ich würde gerne eine Variable haben die ich mit beliebig vielen Dimensionen bestücken kann, genau so wie in PHP 😄

Die Struktur der Variable sollte so zu realisieren sein:

[pre]Variable
|- Alter
|- Haarfarbe
|- Kleider
   |- Hose
	  |- Grösse
	  |- Farbe
	  |- Taschen
	     |- Uhr
		 |- Geldbeutel
		    |- 20€
			|- Kreditkarte
			|- ID
   |- Hemd
      |- Grösse
...[/pre]

In PHP kann man es ja ganz einfach so lösen:


$Array = array();
$Array["ich"] = array();
$Array["ich"]["mache"] = array();
$Array["ich"]["mache"]["was"] = array();
$Array["ich"]["mache"]["was"]["ich"] = array();
$Array["ich"]["mache"]["was"]["ich"]["will"] = "und es funktioniert sogar!";
$Array["ich"]["du"] = "er/sie/es";

Hoffentlich kann mir einer Helfen ^^

MfG

C# - Mittelmässig
vb.NET- Fortgeschritten
PHP - Profi
HTML, CSS, JavaScript (jQuery) - Profi

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo DatMilu,

um eine Baumstruktur zu realisieren braucht man nur eine eigene Knotenklasse zu schreiben. Wenn diese die Properties Nodes(*) und Value hat, dann kannst du fast genauso zugreifen:

var root = new Node ();
root.Nodes ["ich"] = new Node ();
root.Nodes ["ich"].Nodes ["mache"] = new Node ();
root.Nodes ["ich"].Nodes ["mache"].Nodes ["was"] = new Node ();
root.Nodes ["ich"].Nodes ["mache"].Nodes ["was"].Nodes ["ich"]  = new Node ();
root.Nodes ["ich"].Nodes ["mache"].Nodes ["was"].Nodes ["ich"].Nodes ["will"].Value = "und es funktioniert sogar!";

(*) Wenn du über Strings zugreifen willst, dann müsste Nodes vom Typ Dictionary <String, Node> sein. Normal würde man eine List<Node> verwenden.

Bitte beachte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

D
DatMilu Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren

Wow, das es wirklich so einfach geht, hätte ich nicht gedacht.
Ich entschuldige mich für die Neulings-Frage und versuche solche beim nächsten Mal zu vermeiden.

Wen es Interessiert, hier die Klasse die ich erstellt habe:

    class Tree
    {
        public Dictionary<string, Tree> Nodes= new Dictionary<string, Tree>();
        public string Value;

        public Tree(string V="")
        {
            Value = V;
        }
    }

    class App
    {
        public void Main()
        {
            Tree T = new Tree();
            T.Nodes["Erde"] = new Tree();
            T.Nodes["Erde"].Nodes["Lebewesen"] = new Tree("Mensch");
            System.Windows.Forms.MessageBox.Show(T.Nodes["Erde"].Nodes["Lebewesen"]); // Gibt Mensch aus.
        }
    }

Vielleicht wird es Mal einer brauchen 😄

MfG

C# - Mittelmässig
vb.NET- Fortgeschritten
PHP - Profi
HTML, CSS, JavaScript (jQuery) - Profi

1.346 Beiträge seit 2008
vor 10 Jahren

Eine kleine Ergänzung:

Du kannst einen eigenen Indexer schreiben, und so die Aufrufe etwas verkürzen:


        private class Tree
        {
            public Dictionary<string, Tree> Trees = new Dictionary<string, Tree>();
            public string Value;

            public Tree(string V = "")
            {
                Value = V;
            }

            public Tree this[string index]
            {
                get
                {
                    Tree item;
                    if (Trees.ContainsKey(index)) item = Trees[index];
                    else
                    {
                        Trees.Add(index, item = new Tree());
                    }
                    return item;
                }
            }
        }

Dann verkürzt sich der Aufruf auf



                var root = new Tree();
                root["ich"]["mache"]["was"]["ich"]["will"].Value = "und es funktioniert sogar!"; 

D
DatMilu Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren

Wow, danke das macht es mir erheblich leichter 😃

Wusste gar nicht das ich beim Konstruktor einen Indexer erstellen kann.

MfG

Edit: Dieses kleine Script hat mein Programmierverhalten in C# Revolutioniert! Vielen vielen Dank!

C# - Mittelmässig
vb.NET- Fortgeschritten
PHP - Profi
HTML, CSS, JavaScript (jQuery) - Profi

W
955 Beiträge seit 2010
vor 10 Jahren

... und dann kannst Du Dir noch überlegen ob den das Property Value dynamisch machst. (dynamic) Das erzeugt Overhead zur Laufzeit aber dann bist Du php-konform.