samsung personalizado palabras esta disponible diccionario como autocorrector agregar c# optimization dictionary

c# - palabras - no esta disponible el diccionario personalizado outlook



Diferentes formas de agregar al diccionario (7)

¿Cuál es la diferencia en Dictionary.add(key, value) y Dictionary[key] = value ?

Me he dado cuenta de que la última versión no arroja una ArgumentException al insertar una clave duplicada, pero ¿hay alguna razón para preferir la primera versión?

Editar : ¿Alguien tiene una fuente autorizada de información sobre esto? He probado MSDN, pero es como siempre una búsqueda inútil :(


Dadas las similitudes más que probables en el rendimiento, use lo que sea más correcto y legible para la pieza de código que está usando.

Siento una operación que describe una adición, ya que la presencia de la clave que ya es una excepción realmente rara se representa mejor con el complemento. Semánticamente tiene más sentido.

El dict[key] = value representa mejor una sustitución. Si veo ese código, medio espero que la clave ya esté en el diccionario de todos modos.


El rendimiento es casi un 100% idéntico. Puedes verificar esto abriendo la clase en Reflector.net

Este es el indexador de este:

public TValue this[TKey key] { get { int index = this.FindEntry(key); if (index >= 0) { return this.entries[index].value; } ThrowHelper.ThrowKeyNotFoundException(); return default(TValue); } set { this.Insert(key, value, false); } }

Y este es el método Add:

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

No publicaré todo el método Insert porque es bastante largo, sin embargo, la declaración del método es la siguiente:

private void Insert(TKey key, TValue value, bool add)

Y más abajo en la función, esto sucede:

if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key)) { if (add) { ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); }

Que comprueba si la clave ya existe, y si lo hace y el parámetro add es verdadero, arroja la excepción.

Entonces, para todos los propósitos e intenciones, el rendimiento es el mismo.

Al igual que en algunas otras menciones, se trata de si necesita o no el cheque, para intentar agregar la misma clave dos veces.

Perdón por la publicación larga, espero que esté bien.


La primera versión agregará un nuevo KeyValuePair al diccionario, arrojando si la clave ya está en el diccionario. El segundo, usando el indexador, agregará un nuevo par si la clave no existe, pero sobrescribirá el valor de la clave si ya existe en el diccionario.

IDictionary<string, string> strings = new Dictionary<string, string>(); strings["foo"] = "bar"; //strings["foo"] == "bar" strings["foo"] = string.Empty; //strings["foo"] == string.empty strings.Add("foo", "bar"); //throws


Para responder a la pregunta primero, debemos analizar el propósito de un diccionario y la tecnología subyacente.

Dictionary es la lista de KeyValuePair<Tkey, Tvalue> donde cada valor está representado por su clave única. Digamos que tenemos una lista de tus comidas favoritas. Cada valor (nombre del alimento) está representado por su clave única (una posición = cuánto te gusta este alimento).

Código de ejemplo:

Dictionary<int, string> myDietFavorites = new Dictionary<int, string>() { { 1, "Burger"}, { 2, "Fries"}, { 3, "Donuts"} };

Digamos que desea mantenerse saludable, ha cambiado de opinión y desea reemplazar su hamburguesa favorita con ensalada. Su lista sigue siendo una lista de sus favoritos, no cambiará la naturaleza de la lista. Tu favorito seguirá siendo el número uno en la lista, solo cambiará su valor. Esto es cuando llamas a esto:

/*your key stays 1, you only replace the value assigned to this key you alter existing record in your dictionary*/ myDietFavorites[1] = "Salad";

Pero no olvides que eres el programador, y de ahora en adelante terminarás tus oraciones; te niegas a usar emojis porque arrojarían un error de compilación y toda la lista de favoritos está basada en el índice 0.

¡Tu dieta también cambió! Entonces usted altera su lista de nuevo:

/*you don''t want to replace Salad, you want to add this new fancy 0 position to your list. It wasn''t there before so you can either define it*/ myDietFavorites[0] = "Pizza"; /*or Add it*/ myDietFavorites.Add(0, "Pizza");

Hay dos posibilidades para definir, o bien desea dar una nueva definición para algo que no existe antes o si desea cambiar la definición que ya existe.

Agregar método le permite agregar un registro pero solo bajo una condición: la clave para esta definición puede no existir en su diccionario.

Ahora vamos a mirar debajo del capó. Cuando está haciendo un diccionario, su compilador hace una reserva para el depósito (espacios en la memoria para almacenar sus registros). Bucket no almacena claves de la forma en que las define. Cada clave es hash antes de ir al cubo (definido por Microsoft), vale la pena mencionar que la parte del valor permanece sin cambios.

Usaré el algoritmo hash CRC32 para simplificar mi ejemplo. Cuando defines:

myDietFavorites[0] = "Pizza";

Lo que está yendo al cubo es db2dc565 "Pizza" (simplificado).

Cuando modifica el valor con:

myDietFavorites[0] = "Spaghetti";

Hash tu 0 que es nuevamente db2dc565 luego buscas este valor en tu cubo para encontrar si está allí. Si está allí, simplemente reescribe el valor asignado a la tecla. Si no está allí, colocará su valor en el cubo.

Cuando llamas a Agregar función en tu diccionario como:

myDietFavorite.Add(0, "Chocolate");

Hash tu 0 para comparar su valor con los del cubo. Puede colocarlo en el cubo solo si no está allí .

Es crucial saber cómo funciona, especialmente si trabaja con diccionarios de cadena o tipo de clave de char. Es sensible a mayúsculas y minúsculas debido a someterse a hash. Entonces, por ejemplo, "nombre"! = "Nombre". Usemos nuestro CRC32 para representar esto.

El valor para "nombre" es: e04112b1 El valor para "Nombre" es: 1107fb5b


Sí, esa es la diferencia, el método Add arroja una excepción si la clave ya existe.

La razón para usar el método Agregar es exactamente esto. Si se supone que el diccionario ya no contiene la clave, generalmente desea la excepción para que tenga conocimiento del problema.


Uno está asignando un valor mientras que el otro está agregando al diccionario una nueva clave y valor.


Dictionary.Add(key, value) y Dictionary[key] = value tienen diferentes propósitos:

  • Use el método Add para agregar un nuevo par clave / valor, las claves existentes no serán reemplazadas (se lanza una ArgumentException ).
  • Utilice el indexador si no le importa si la clave ya existe en el diccionario, en otras palabras: agregue el par de clave / valor si la clave no está en el diccionario o reemplace el valor de la clave especificada si la clave ya está en el diccionario.