Najlepsza implementacja struktury danych pary kluczowych wartości?

Ostatnio trochę grzebałem w C# i wszystkie ogólne Kolekcje trochę mnie mylą. Powiedzmy, że chciałem reprezentować strukturę danych, w której głowa drzewa była parą wartości klucza, a następnie istnieje jedna opcjonalna lista par wartości klucza poniżej (ale nie więcej poziomów niż te). Czy to będzie odpowiednie?

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;
}
To tylko prosta Boczka do przekazywania danych.
Author: Chris, 2008-08-12

8 answers

Istnieje rzeczywisty typ danych o nazwie KeyValuePair, użyj w ten sposób

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
 133
Author: Adam Haile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 21:12:17

Jedną z możliwych rzeczy, które możesz zrobić, to użyć obiektu Dictionary prosto z pudełka, a następnie rozszerzyć go o własne modyfikacje:

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

Daje Ci to przewagę, że nie musisz egzekwować zasad IDictionary dla Twojego klucza (np. unikalność klucza itp.).

I tak masz dobrze pojęcie konstruktora:)

 12
Author: Jon Limjap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 13:25:12

Myślę, że to, czego możesz chcieć (jako dosłowna realizacja Twojego pytania), to:

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

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

Rzeczywiście powiedziałeś "listę" wartości kluczy w swoim pytaniu, więc możesz chcieć zamienić wewnętrzne {[2] } na:

IList<KeyValuePair<string, string>>
 7
Author: Shaun Austin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 13:45:21

Istnieje wbudowany typ KeyValuePair. W rzeczywistości, to jest to, do czego IDictionary daje Ci dostęp podczas iteracji w nim.

Również ta struktura nie jest drzewem, znalezienie bardziej reprezentatywnej nazwy może być dobrym ćwiczeniem.

 5
Author: Coincoin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 13:23:27

Jeszcze jedna rzecz do dodania (chociaż myślę, że już odpowiedzieli na twoje pytanie inni). W trosce o rozciągliwość (ponieważ wszyscy wiemy, że to się stanie w pewnym momencie) możesz sprawdzić Wzór kompozytowy jest to idealne rozwiązanie do pracy z "strukturami przypominającymi drzewa"..

Tak jak mówiłem, wiem, że oczekujesz tylko jednego podpoziomu, ale to może być naprawdę przydatne dla Ciebie, jeśli później będziesz musiał rozszerzyć ^_^

 3
Author: Rob Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 13:45:50

@Jay Mooney : OGÓLNA Klasa słownika w. NET jest w rzeczywistości tabelą hashową, tylko ze stałymi typami.

Pokazany kod nie powinien nikogo przekonywać do używania Hashtable zamiast słownika, ponieważ oba elementy kodu mogą być używane dla obu typów.

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

Dla słownika:

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

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

I tak samo dla drugiej z KeyValuePair, po prostu użyj nie-generycznej wersji dla Hashtable i generycznej wersji dla słownika.

Więc jest to tak samo proste w obie strony, ale Hashtable używa obiektu zarówno dla klucza, jak i wartości, co oznacza, że polecisz wszystkie typy wartości, a nie masz bezpieczeństwa typu, A Słownik używa typów generycznych i dlatego jest lepszy.

 2
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:24:56

Klasa słownika jest dokładnie tym, czego chcesz, popraw.

Możesz zadeklarować pole bezpośrednio jako słownik, zamiast IDictionary, ale to zależy od Ciebie.

 1
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 13:22:01

Użyj czegoś takiego:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  
Jest brzydki, ale myślę, że da ci to, czego chcesz. Szkoda, że KeyValuePair jest zamknięty.
 1
Author: kokos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 13:41:59