multivalues-key dictionary

0

chcialbym slownik z multi-wartosciami klucza, najlepiej z mozliwoscia okreslenia ilosci skladowych klucza przy tworzeniu (oraz typow poszczegolnych skladowych klucza)
czyli np. MyDictionary<int, string, DateTime, MyValueType> myD
indexer np. myD[1,"foo",new DateTime(2010,5,15)] zwraca obiekt MyValueType

rozwiazania:
1) zaimplementowac wlasny slownik np. Dictionary<K1,K2,V>, Dictionary<K1,K2,K3,V>, ...
2) uzycie standardowego slownika, a jako klucza struktury Key<K1,K2>, Key<K1,K2,K3>, ...

tylko to nie rozwiazuje mojego problemu ilosci skladowych klucza (2,3,4,...), bo musze zaimplementowac kilka klas, zeby miec typowanie poszczegolnych skladowych klucza oraz obslugiwac ich dynamiczna ilosc

raczej nie chce umozliwiac dobierania sie po czesci klucza, czyli np. myD[1,"foo"], przynajmniej nie przwiduje takiego indexera, moze jakies dedykowane wyszukiwanie (lub zostaje linq)

oczywiscie moge poswiecic chwile i to zrobic, zastanawiam sie jeszcze nad sposobem implementacji pod spodem
1) kaskadowe slowniki Dictionary<K1, Dictionary<K2, Dictionary<K3, TValue>>>
2) Dictionary<Key<K1,K2,K3>, TValue>
3) drzewa AVL, z kluczem Key<K1,K2,K3>
jakis inny ciekawy pomysl na implementacje?

0

osobiscie, zazwyczaj sie nie bawie i w momencie gdy potrzebuje klucz np. poczworny A,B,C,D, koncze z rozwiazaniem 2) wprost z czyms takim:
private struct X {A a, B b, C c, D d};
-> Dictionary<X, TItem>
da sie to uogolnic na szablon o kluczu N-elementowym, ale raczej przy pomocy 'normalnych' rzeczy nie uda Ci sie uogolnic tego na ?-elementowy klucz, chyba ze nie potrzebujesz typizacji - wtedy po reflection spokojnie, albo na chama klucz typu array = new[]{a,b,c,..} :/

co rozumiesz przez 'dynamiczna ilosc' ? mozesz do jednej mapy wstawiac elementy o roznej ilosci pol klucza?

jesli ilosc pol klucza ma byc stala - imho, najlepiej przygotowac kilka szablonow o ilosciach np. 2..6, ale wydmuszek -- o wspolnej bazie lub oddelegowanej implementacji - tak zeby 7+ dawalo sie przez proste i bezpieczne copy-paste sobie na biezaco dogenerowac i bylo to proste i bezpieczne

rozwiazanie nr 1 stosowalbym tylko w momencie gdy podejrzewam, ze bedzie problem z utworzeniem dobrej GetHashCode spowodowane kolizjami miedzy elementami klucza. w innych wypadkach po co sztucznie indeksowac wielopoziomowo?
a nr 3 - gdy z jakiegos powodu wszystkie inne mozliwosci padly:) albo gdy przewidujesz ze na prawde wypelnienie slownika bedzie duze i chcesz faktycznie zrezygnowac z obiecanek o O(1) - np. gdy w ogole ciezko o dobry GetHashCode(), ale pozostaje pytanie - jaka wtedy metryka ważąca elementy? na dobra sprawe, jak ja znajdziesz, to juz masz dobry gethashcode i dictionary bedzie ok..

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0