2013-09-30 13 views
6

Szukam sposobu na uzyskanie wielu kluczy z jedną wartością o wartości. Tak, użyłem już funkcji wyszukiwania, ale większość odpowiedzi jest skierowana w przeciwnym kierunku (wiele wartości wartości na klucz ), ale chcę czegoś przeciwnego.Słownik C#: wiele kluczy na wartość

Powodem tego jest to, że chcę zachować wiele identyfikatorów przedmiotów (dla Bot) na "główny" identyfikator, a wrzucanie tych wielu identyfikatorów do wartości jest zbyt wolne, aby je zmodyfikować (szukając jednej wartości => zapętlanie przez wszystkie główne identyfikatory & uzyskiwanie każdej wartości, a następnie sprawdzanie, czy identyfikator istnieje).

Przykład

Key 1 => Value 
Key 2 => Value 
Key 3 => Value 
Key 4 => Value 
Key 5 => Value 2 

Szukasz Wartość powinna powrócić: Key 1-4, a nie 5

Więc szukam sposobu, aby to zrobić łatwiej - jak powiedziałem wyżej.

Ktoś wie, czy to możliwe i jak to zrobić? Z góry dzięki.

+0

można utworzyć klucz kompozytowego (może to być przedmiot, ty wiem), ale wyszukiwanie według tego klucza byłoby mniej niż optymalne –

+3

Czy możesz pokazać jakiś egzamin na wejściu/wyjściu, być może, jakie operacje chcesz wywołać w tej strukturze danych. – Servy

+1

Co dokładnie próbujesz tutaj egzekwować? Biorąc pod uwagę twój przykład, to, co nazywasz "wartością", jest tak naprawdę kluczem, a twoja rzeczywista wartość musi być tylko zbiorem. –

Odpowiedz

2

wykonaj słownik odwrotnie i utwórz wartość listy przedmiotów.

jeśli na przykład Value jest ciągiem i Key 1-4 są ints słownika mógłby wyglądać następująco:

var theDictionary = new Dictionary<string, List<int>>(); 

pobierania Value przez theDictionary["Value"] by następnie powrócić listę int zawierających 1, 2, 3 i 4.

Edycja - Dodano przykład:

var theDictionary = new Dictionary<string, List<string>> 
    { 
     {"Value", new List<string> {"Key 1", "Key 2", "Key 3", "Key 4", "Key 5",}}, 
     {"Value2", new List<string> {"Key 5", "Key 2"}} 
    }; 

var oneToFour = theDictionary["Value"]; 
+0

Myślę, że nadal jest to dla mnie najłatwiejszy wariant. Dziękuje wszystkim! – user1818486

5

Edit: Patrząc na edycję, to naprawdę wygląda jak zostały zaprojektowane ten Dictionary tyłu ... klucze powinny być dopasowane do wartości, a nie swoje wartości do dopasowywania kluczy.

Można zrobić coś w rodzaju tworzenia słownika mapującego klawisze zewnętrzne na klawisze wewnętrzne, a następnie używać klawisza wewnętrznego do indeksowania drugiego słownika.

Przykład:

var outer = new Dictionary<int, Guid> { 
    { 1, GuidA }, 
    { 2, GuidA }, 
    { 3, GuidA }, 
    { 4, GuidA }, 
    { 5, GuidB } 
}; 
var inner = new Dictionary<Guid, Value> { 
    { GuidA, Value1 }, 
    { GuidB, Value2 } 
}; 

by uzyskać dostęp go jako: value = outer[inner[key]].

1

1) Servy są całkowicie poprawne. Jeśli szukasz czegoś poza kluczem ... i jeśli próbujesz odzyskać wszystko poza odpowiednią wartością ... to coś jest zdecydowanie nie tak. Wszystkie rzeczy są równe, prawdopodobnie NIE chcesz słownika.

2) Na podstawie tego, co mówisz, być może lepszym typem kolekcji może być lista. W szczególności lista par nazwa/wartość.

PRZYKŁAD:

List<string> NVList = new List<string>(); 
NVList.Add("color=blue"); 
... 

3) Należy zauważyć, że .NET posiada specjalistyczną "NameValueCollection" klasy, które mogą być IDEAL dla Ciebie:

3

Możesz być overthinki Wasz problem. Klucze muszą być unikalne, aby były użyteczne w operacjach wyszukiwania. Wartości nie muszą być unikalne. Wiele klawiszy może wskazywać tę samą wartość bez powodowania problemów.

0

Zakładając, że masz słownik początkowy (mapowanie kluczy do wartości), możesz już użyć Linqa, aby przekonwertować go na słownik zwrotny bez konieczności ręcznego tworzenia tego odwrotnego słownika.

var newDict = initialDict.Select(x=>x.Value).Distinct().ToDictionary(x=>x, x=> initialDict.Where(kvp=>kvp.Value == x).Select(kvp=>kvp.Key)); 

Wybierz odrębną originalValues z oryginalnego słownika i używać tych jako newKeys. Twój newValues jest zbiorem twoich originalKeys mapowanych do każdego z nich //.


Przykład: https://dotnetfiddle.net/dhwUSC

Biorąc pod uwagę początkowe Słownik

var initialDict = new Dictionary<int, string>{ 
     {1, "Value"}, 
     {2, "Value"}, 
     {3, "Value"}, 
     {4, "Value"}, 
     {5, "Value2"} 
    }; 

powyższym zwraca

Value: {1, 2, 3, 4} 
Value2: {5} 
Powiązane problemy