Domanda

Quindi ultimamente ho curiosato un po' con C# e tutte le raccolte generiche mi hanno confuso un po'.Supponiamo che io voglia rappresentare una struttura dati in cui la testa di un albero sia una coppia chiave-valore, e poi c'è un elenco facoltativo di coppie chiave-valore sotto quella (ma non più livelli di questi).Sarebbe adatto?

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;
}

In realtà è solo un semplice shunt per il passaggio dei dati.

È stato utile?

Soluzione

Esiste un tipo di dati effettivo chiamato KeyValuePair, da utilizzare in questo modo

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

Altri suggerimenti

Una cosa possibile che potresti fare è usare l'oggetto Dictionary immediatamente e poi estenderlo semplicemente con le tue modifiche:

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

Questo ti dà il vantaggio di non dover applicare le regole di IDictionary per la tua chiave (ad esempio, unicità della chiave, ecc.).

E sì, hai capito bene il concetto di costruttore :)

Penso che quello che potresti cercare (come implementazione letterale della tua domanda) è:

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

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

In realtà hai detto un "elenco" di valori-chiave nella tua domanda, quindi potresti voler scambiare il file inner IDictionary con un:

IList<KeyValuePair<string, string>>

Esiste un tipo integrato KeyValuePair.È un dato di fatto, questo è ciò a cui IDictionary ti dà accesso quando lo iteri.

Inoltre, questa struttura non è certo un albero, trovare un nome più rappresentativo potrebbe essere un buon esercizio.

Solo una cosa da aggiungere a questo (anche se penso che tu abbia già avuto risposta alla tua domanda da altri).Nell'interesse dell'estensibilità (poiché sappiamo tutti che accadrà ad un certo punto) potresti voler controllare il file Modello composito Questo è l'ideale per lavorare con "strutture ad albero".

Come ho detto, so che ti aspetti solo un sottolivello, ma questo potrebbe davvero esserti utile se in seguito avrai bisogno di estenderlo ^_^

@Jay Mooney:Una classe Dictionary generica in .NET è in realtà una tabella hash, solo con tipi fissi.

Il codice che hai mostrato non dovrebbe convincere nessuno a utilizzare Hashtable invece di Dictionary, poiché entrambi i pezzi di codice possono essere utilizzati per entrambi i tipi.

Per la tabella hash:

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);
}

Per dizionario:

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

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

E lo stesso per l'altro con KeyValuePair, basta usare la versione non generica per Hashtable e la versione generica per Dictionary.

Quindi è altrettanto semplice in entrambi i modi, ma Hashtable utilizza Object sia per la chiave che per il valore, il che significa che inserirai tutti i tipi di valore e non avrai l'indipendenza dal tipo, mentre Dictionary utilizza tipi generici ed è quindi migliore.

Classe dizionario è esattamente quello che vuoi, corretto.

Puoi dichiarare il campo direttamente come Dictionary, anziché IDictionary, ma dipende da te.

Usa qualcosa del genere:

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

È brutto, ma penso che ti darà quello che vuoi.Peccato che KeyValuePair sia sigillato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top