2009-08-07 10 views

Odpowiedz

488

Tylko punkt do słownika na dany klucz i przypisać nową wartość:

myDictionary[myKey] = myNewValue; 
+6

ta powinna być odpowiedź na pytanie !!! –

+0

Ta prosta metoda wydaje się być lepszym zamiennikiem dobrze znanej metody ".Add" i ".TryGetValue" bez konieczności zmiany wartości. (?) Przynajmniej, jeśli nie ma znaczenia nadpisywanie kluczy, na przykład w sytuacji, gdy nie jest wykluczone, że klucze są zapisywane więcej niż jeden raz w pętli. A może ktoś widzi jakieś wady? Zwłaszcza, że ​​.Add ma plik ptifall dla początkujących, że jeśli zapomni się if-wrapper lub TryGetValue, może to działać dobrze w testach iz innymi danymi testowymi, gdzie adres .Add jest wywoływany dwa razy dla tego samego klucza, który wyrzuci wyjątek. – Philm

+0

Interesującym punktem tej operacji jest to, że UPSERT (klucz, wartość) do słownika. znakomity! – Soren

171

Jest to możliwe dzięki dostępowi do klucza jako indeks

na przykład:

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
dictionary["test"] = 1; 
dictionary["test"] += 1; 
Console.WriteLine (dictionary["test"]); // will print 2 
+9

Jeśli na liście nie ma pozycji "test", wówczas lista ["test"] = lista ["test"] + 1; podniesie KeyNotFoundException! Będzie działał czysty przydział nieistniejącego indeksera. lista ["test"] = 1; –

+0

Czy możesz również użyć listy ["test"] ++ ;? – aufty

+9

Nie dzwoń na listę słowników, nazwij to psami lub kotami albo wymów: – user3800527

7

Tutaj to sposób na aktualizację przez indeks podobny do foo[x] = 9 gdzie x jest kluczem, a 9 jest wartością

var views = new Dictionary<string, bool>(); 

foreach (var g in grantMasks) 
{ 
    string m = g.ToString(); 
    for (int i = 0; i <= m.Length; i++) 
    { 
     views[views.ElementAt(i).Key] = m[i].Equals('1') ? true : false; 
    } 
} 
+9

m [i] .Equals ("1") już ocenia bool, więc dodajesz? true: false nie jest konieczne –

+0

Nie wiem, jak efektywna jest ta logika, ale podoba mi się idea pętli For. :) –

31

Możesz śledzić to podejście:

void addOrUpdate(Dictionary<int, int> dic, int key, int newValue) 
{ 
    int val; 
    if (dic.TryGetValue(key, out val)) 
    { 
     // yay, value exists! 
     dic[key] = val + newValue; 
    } 
    else 
    { 
     // darn, lets add the value 
     dic.Add(key, newValue); 
    } 
} 

Krawędź można uzyskać tutaj jest to, że sprawdzić i uzyskać wartość odpowiadającą klucz w ciągu zaledwie 1 dostępem do słownika. Jeśli używasz ContainsKey, aby sprawdzić istnienie i zaktualizować wartość za pomocą dic[key] = val + newValue;, wówczas uzyskujesz dostęp do słownika dwa razy.

+3

Zamiast 'dic.Add (key, newValue); możesz użyć' dic [key] = newvalue; '. – Macke

+0

Co stanie się, jeśli zrobisz "dic [klucz] = wartość" i "klucz" nie istnieje? – superpuccio

+1

@superpuccio otrzymasz KeyNotFoundException – ntroncos

13

używać LINQ: Dostęp do słownika na klucz i zmienić wartość

Dictionary<string, int> dict = new Dictionary<string, int>(); 
dict = dict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value + 1); 
+0

Nie rozumiem nawet, jak to działa, ale to jest niesamowite – hexagonest

+0

Tworzenie kolejnego słownika nie ma dla mnie sensu w tak prostej rzeczy. Sprawdź odpowiedź ccalboni. – RollerCosta

+0

Myślę, że to dobra odpowiedź. nie wymaga znajomości każdego ciągu kluczy –

Powiązane problemy