2011-05-20 16 views
18

Si deseo poner elementos en un System.Collections.Generic.Dictionary, puedo Add o configurar el Item.System.Collections.Generic.Dictionary `Add` vs set` Item`

sé si lo hacemos Add comprueba si la clave ya existe y si no se produce una excepción.

Entonces, cuando agregue una tonelada de elementos, ¿debería preferir configurar Item en lugar de Add, ya que Add realiza controles innecesarios que en realidad pueden desacelerar las cosas?

Respuesta

35

Esto es lo que sucede cuando se establece artículo:

public void set_Item(TKey key, TValue value) 
{ 
    this.Insert(key, value, false); 
} 

Esto es lo que sucede cuando se agrega material:

public void Add(TKey key, TValue value) 
{ 
    this.Insert(key, value, true); 
} 

El último parámetro último parámetro bool add solo afecta a esta línea:

if (add) 
{ 
    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); 
} 

Así que si quieres una excepción cuando se agrega un elemento duplicado, usted nee d para usar Agregar. Si desea sobrescribir el elemento que sale, debe configurar el artículo.

+1

Una gran respuesta sensata. –

+1

¿cómo hiciste eso? no puedo encontrar el "código detrás" – Pacerier

+1

@Pacerier, hacer una búsqueda en Google de reflector ** ** – Stormenet

3

Todo eso depende de si desea gestionar claves duplicadas o sobrescribir cualquier elemento potencialmente existente. Para buscar duplicados, puede usar:

Por ejemplo:

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

Console.WriteLine(dict.ContainsKey(1)); // false 
dict[1] = "hi"; 
dict[1] = "hello"; // "hi" is overwritten 

// true: hello 
Console.WriteLine("{0}: {1}", dict.ContainsKey(1), dict[1]); 

// TryGetValue if checking by key and interested in the value 
string result; 
if (dict.TryGetValue(1, out result)) 
{ 
    Console.WriteLine("Key 1 exists: " + result); 
} 
else 
{ 
    Console.WriteLine("Key 1 not found"); 
} 
+0

¿'Contendría' sería mejor para el control de duplicados? –

+0

@Alex los métodos 'ContainsKey' o' ContainsValue' proporcionados por la clase 'Dictionary' serían una buena opción. ¿Te refieres a esos o 'Enumerable.Contains'? En este último caso, sería necesario enviar primero la colección 'Keys', como' dict.Keys.Cast () .Contains (1) ', que no vale la pena debido a los métodos disponibles. –

+0

Lo siento, quise decir ContainsKey. –

2

excepciones que lanzan son baratos, su manejo que les es caro. La porción de prueba del bloque try/catch se ejecuta de forma normal. Cuando se ejecuta un bloque catch, tiene que desenrollar la pila para llenar el seguimiento de la pila (entre otras cosas). Esto es lo que hace que las excepciones sean costosas. Esta es la razón para evitar detectar excepciones si tiene los medios para hacerlo utilizando métodos como Dictionary<T>.ContainsKey

Es muy poco probable que alguna vez note la diferencia de rendimiento entre llamar y agregar elementos. Entonces usa el que sea más apropiado para la situación.

Actualización: no optimizan su código a menos que sea lento.

Cuestiones relacionadas