Cea mai bună implementare pentru structura de date pentru perechea de chei cheie?

Așa că am mai făcut ceva în ultima vreme cu C#, iar toate colecțiile Generic mi-au făcut o mică confuzie. Spun că vroiam să reprezint o structură de date în care capul unui arbore a fost o pereche de valori cheie și apoi există o listă opțională de perechi cheie de valori sub această valoare (dar nu mai multe niveluri decât acestea). Ar fi potrivit acest lucru?

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

    public string Key;
    public string Value;
    public IDictionary SubPairs;
}

Este doar o simplă șunt pentru trecerea datelor.

0
fr hi bn

8 răspunsuri

Există un tip de date real numit KeyValuePair, utilizați astfel

KeyValuePair myKeyValuePair = new KeyValuePair("defaultkey", "defaultvalue");
0
adăugat
KeyValuePair <șir, șir> NAME_HERE = nou KeyValuePair ("defaultkey", "defaultvalue");
adăugat autor HasanAboShally, sursa
Acest lucru funcționează excelent cu o declarație de "folosire" (similară cu cea a vechiului typedef) pentru a salva o tastare și a face totul mai clar. Dacă utilizați în mod constant e. g. șirul (șir, șir).
adăugat autor Andreas Reiff, sursa
Pentru a extinde comentariul lui @AndreasReiff: folosind NameValuePair = System.Collections.Generic.KeyValuePair ; în partea de sus a fiecărui fișier care are nevoie de (string, string)/code> structura. Deși am găsit mai convenabil să creez o clasă NameValuePair în spațiul meu de nume: public class NameValuePair {KeyValuePair it; numeValuePair public (numele șirului, valoarea șirului) {it = nou KeyValuePair (nume, valoare); } șir public Numele {get {return it.Key; }} șir public de valoare {get {return
adăugat autor ToolmakerSteve, sursa

Un lucru posibil ar putea fi să utilizați obiectul Dicționar direct din cutie și apoi să-l extindeți cu modificările proprii:

public class TokenTree : Dictionary
{
    public IDictionary SubPairs;
}

Acest lucru vă oferă avantajul de a nu trebui să impuneți regulile IDictionary pentru cheia dvs. (de ex., Unicitatea cheilor etc.).

Și ai primit conceptul constructorului potrivit :)

0
adăugat

Există un tip built-in KeyValuePair. De fapt, acesta este ceea ce IDictionary îți dă acces atunci când repetă în el.

De asemenea, această structură este greu un copac, găsirea unui nume mai reprezentativ ar putea fi un exercițiu bun.

0
adăugat

Dictionary Class is exactly what you want, correct.

Puteți declara câmpul direct ca Dicționar, în loc de IDictionary, dar depinde de dvs.

0
adăugat

@ Jay Mooney : O clasă de dicționare generică în .NET este de fapt o tabelă de tip hash, doar cu tipuri fixe.

Codul pe care l-ați afișat nu trebuie să convingă pe nimeni să utilizeze Hashtable în loc de Dicționar, deoarece ambele piese de cod pot fi folosite pentru ambele tipuri.

Pentru hashtable:

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

Pentru dicționar:

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

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

Și la fel pentru celălalt cu KeyValuePair, utilizați versiunea non-generică pentru Hashtable și versiunea generică pentru Dicționar.

Deci este la fel de ușor și în ambele sensuri, dar Hashtable folosește Object atât pentru cheie, cât și pentru valoare, ceea ce înseamnă că veți încadra toate tipurile de valori și nu aveți siguranță de tip, iar Dicționarul utilizează tipuri generice și, prin urmare, este mai bun.

0
adăugat

Utilizați ceva de genul:

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

Este urât, dar cred că vă va oferi ceea ce doriți. Păcat că KeyValuePair este sigilat.

0
adăugat

Doar un lucru de adăugat la acest lucru (deși cred că ați răspuns deja la întrebarea dvs. de către alții). În interesul extensibilității (deoarece știm cu toții că se va întâmpla la un moment dat), vă recomandăm să verificați Modelul compozit Acesta este ideal pentru lucrul cu" Structuri asemănătoare copacilor "..

Asa cum am spus, stiu ca astepti doar un sub-nivel, dar acest lucru ar putea fi cu adevarat util pentru tine daca mai tarziu trebuie sa-ti extind ^ _ ^

0
adăugat

Cred că ceea ce ați putea fi după (ca o implementare literală a întrebării dvs.) este:

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary>();
    }

    IDictionary> tree; 
}

Ați spus de fapt o "listă" de chei-valori în întrebarea dvs., astfel încât ați putea dori să schimbați IDictionary cu un:

IList>
0
adăugat