2009-10-28 5 views
5

Przepuszczam przez niektóre obiekty i inicjuję słownik> obiekt.Dodaj pozycje do słownika <int, lista <int>>

więc najpierw sprawdzić, czy klucz istnieje, jeśli nie dodam do listy

Jeśli nie, będę tworzyć nowy klucz i nowej listy

Czy to prawo logiki ?
będę musiał zrobić:

new List<int>(); 

pierwszy raz, kiedy wstawić element prawda?

tj .:

if(myDic.ContainsKey(car.ID)) 
{ 
     myDic[car.ID].Add(car.MfgID); 
} 
else 
{ 
    myDic.Add(car.ID, new List<int>); 
    myDic[car.ID].Add(car.MfgID); 
} 

Odpowiedz

19

Twoje podejście działa dobrze. Jest to trochę nieefektywne, ponieważ wymaga dwóch wyszukiwań słownika (jeden dla Contains i jeden dla dodania elementu do listy). Można zrobić to bardziej efektywne wykorzystanie Dictionary.TryGetValue metody:

List<int> list; 
if (!myDic.TryGetValue(car.ID, out list)) 
    myDic.Add(car.ID, list = new List<int>()); 
list.Add(car.MfgId); 

To jest bardziej wydajne, aby wypełnić listę i dodać je do słownika w jednej porcji (jeśli jest to możliwe w przypadku, oczywiście). W języku C# 3.0, jest to funkcja o nazwie inicjalizatory kolekcja który ułatwia wypełnić listę jeżeli rzeczy są znane w czasie kompilacji:

var list = new List<int> { 1, 9, 8, 9, 1, 8, 1, 2 }; 

Można również rozważyć użycie something like this to map a key to multiple values.

+0

Świetnie, teraz ty i Reed musicie połączyć obie odpowiedzi w jedną :) –

+0

Och, i inicjatory kolekcji mogą być również warte wspomnienia. –

+0

@Pavel: Moja odpowiedź eliminuje potrzebę zmiany kolejności, o której mowa w odpowiedzi Reeda. Zawsze wykonuje pojedyncze wyszukiwanie słownika. –