2009-08-07 15 views

Respuesta

488

Sólo punto al diccionario en dado clave y asignar un nuevo valor:

myDictionary[myKey] = myNewValue; 
+6

Esta debe ser la respuesta a la pregunta !!! –

+0

Por lo que este método simple parece ser también un mejor sustituto del bien conocido método ".Add" y ".TryGetValue" sin la necesidad de cambiar el valor. (?) Al menos, si no importa sobrescribir claves, por ejemplo, en una situación en la que no está excluido, las claves se escriben más de una vez en un bucle. ¿O alguien ve alguna desventaja? Especialmente porque .Add tiene el ptifall para principiantes que si se olvida el if-wrapper o TryGetValue, puede funcionar bien en las pruebas y con otros datos de prueba donde el .Add se invoca dos veces para la misma clave arrojará una excepción. – Philm

+0

el punto interesante de esta operación es que, UPSERT (clave, valor) en el diccionario. ¡brillante! – Soren

171

Es posible acceder a la clave como índice de

por ejemplo:

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

Si no hay un elemento "prueba" en la Lista, entonces liste ["prueba"] = lista ["prueba"] + 1; elevará KeyNotFoundException! La asignación pura de un indexador no existente funcionará. lista ["prueba"] = 1; –

+0

¿También puede usar list ["test"] ++ ;? – aufty

+9

no llame a una lista de diccionarios, llámele perros o gatos o dict – user3800527

7

Aquí es una forma de actualizar por un índice muy similar a foo[x] = 9 donde x es una clave y 9 es el valor

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

la m [i] .Equals ('1') ya se evalúa como un bool, por lo que agrega? verdadero: falso no es necesario –

+0

No sé cuán eficiente es esta lógica, pero me gusta la idea del bucle For. :) –

31

Puede seguir este enfoque:

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); 
    } 
} 

El borde se obtiene aquí es que compruebe y obtener el valor de la tecla correspondiente en tan sólo 1 Acceso al diccionario. Si usa ContainsKey para verificar la existencia y actualiza el valor usando dic[key] = val + newValue;, entonces está accediendo al diccionario dos veces.

+3

En lugar de 'dic.Add (clave, newValue);' puede usar use 'dic [key] = newvalue;'. – Macke

+0

¿Qué sucede si haces "dic [key] = value" y "key" no existe? – superpuccio

+1

@superpuccio recibe una KeyNotFoundException – ntroncos

13

uso de LINQ: El acceso a Inglés para la llave y cambiar el valor

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

Ni siquiera entiendo cómo funciona esto, pero es increíble – hexagonest

+0

La creación de otro diccionario no tiene sentido para mí por algo tan simple. Verifique la respuesta de ccalboni. – RollerCosta

+0

creo que es una buena respuesta. no requiere que sepas cada cadena clave –

Cuestiones relacionadas