Frage

Deshalb habe ich mich in letzter Zeit ein wenig mit C# beschäftigt, und die ganzen generischen Sammlungen haben mich ein wenig verwirrt.Angenommen, ich möchte eine Datenstruktur darstellen, bei der der Kopf eines Baums ein Schlüssel-Wert-Paar ist und sich darunter eine optionale Liste von Schlüssel-Wert-Paaren befindet (jedoch nicht mehr Ebenen als diese).Wäre das geeignet?

public class TokenTree
{
    public TokenTree()
    {
        /* I must admit to not fully understanding this,
         * I got it from msdn. As far as I can tell, IDictionary is an
         * interface, and Dictionary is the default implementation of
         * that interface, right?
         */
        SubPairs = new Dictionary<string, string>();
    }

    public string Key;
    public string Value;
    public IDictionary<string, string> SubPairs;
}

Es ist eigentlich nur ein einfacher Shunt für die Weitergabe von Daten.

War es hilfreich?

Lösung

Es gibt einen tatsächlichen Datentyp namens KeyValuePair, den Sie wie folgt verwenden können

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");

Andere Tipps

Eine Möglichkeit wäre, das Dictionary-Objekt direkt aus der Box zu verwenden und es dann einfach mit Ihren eigenen Änderungen zu erweitern:

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

Dies bietet Ihnen den Vorteil, dass Sie die Regeln von IDictionary für Ihren Schlüssel nicht durchsetzen müssen (z. B. Eindeutigkeit des Schlüssels usw.).

Und ja, Sie haben das Konzept des Konstruktors richtig verstanden :)

Ich denke, was Sie (als wörtliche Umsetzung Ihrer Frage) suchen könnten, ist:

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

    IDictionary<string, IDictionary<string, string>> tree; 
}

Sie haben in Ihrer Frage tatsächlich eine „Liste“ von Schlüsselwerten genannt, daher möchten Sie möglicherweise den inneren Wert austauschen IDictionary mit einem:

IList<KeyValuePair<string, string>>

Es gibt einen integrierten Typ „KeyValuePair“.Tatsächlich ist es das, worauf das IDictionary Ihnen Zugriff gewährt, wenn Sie darin iterieren.

Da es sich bei dieser Struktur auch kaum um einen Baum handelt, könnte es eine gute Übung sein, einen repräsentativeren Namen zu finden.

Ich möchte dem nur noch eine Sache hinzufügen (obwohl ich glaube, dass Ihre Frage bereits von anderen beantwortet wurde).Im Interesse der Erweiterbarkeit (da wir alle wissen, dass es irgendwann passieren wird) sollten Sie sich das ansehen Zusammengesetztes Muster Dies ist ideal für die Arbeit mit „Baumähnlichen Strukturen“.

Wie gesagt, ich weiß, dass Sie nur eine Unterebene erwarten, aber diese könnte wirklich nützlich für Sie sein, wenn Sie ^_^ später erweitern müssen

@Jay Mooney:Eine generische Dictionary-Klasse in .NET ist eigentlich eine Hash-Tabelle, nur mit festen Typen.

Der von Ihnen gezeigte Code sollte niemanden davon überzeugen, Hashtable anstelle von Dictionary zu verwenden, da beide Codeteile für beide Typen verwendet werden können.

Für Hashtabelle:

foreach(object key in h.keys)
{
     string keyAsString = key.ToString(); // btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

Für Wörterbuch:

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

Und genau das Gleiche gilt für das andere mit KeyValuePair. Verwenden Sie einfach die nicht-generische Version für Hashtable und die generische Version für Dictionary.

Es ist also in beide Richtungen genauso einfach, aber Hashtable verwendet Object sowohl für den Schlüssel als auch für den Wert, was bedeutet, dass Sie alle Werttypen einschließen und keine Typsicherheit haben, und Dictionary verwendet generische Typen und ist daher besser.

Wörterbuchklasse ist genau das, was Sie wollen, richtig.

Sie können das Feld direkt als Dictionary statt als IDictionary deklarieren, aber das bleibt Ihnen überlassen.

Verwenden Sie so etwas:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

Es ist hässlich, aber ich denke, es wird dir geben, was du willst.Schade, dass KeyValuePair versiegelt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top