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. 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");
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:)
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>>
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.
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ć ^_^
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.
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.
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.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