c# - generate - ¿Hay una forma más elegante de agregar un elemento a un Diccionario<> de forma segura?
initialize dictionary c# (5)
Aunque usar el indexador es claramente la respuesta correcta para su problema específico, otra respuesta más general al problema de agregar funcionalidad adicional a un tipo existente sería definir un método de extensión.
Obviamente, este no es un ejemplo particularmente útil, sino algo a tener en cuenta la próxima vez que encuentre una necesidad real:
public static class DictionaryExtensions
{
public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict,
TKey key, TValue value)
{
dict[key] = value;
}
}
Necesito agregar pares de clave / objeto a un diccionario, pero por supuesto necesito verificar primero si la clave ya existe, de lo contrario aparece el error "la clave ya existe en el diccionario ". El código a continuación resuelve esto, pero es torpe.
¿Cuál es una forma más elegante de hacer esto sin hacer un método de ayudante de cuerda como este?
using System;
using System.Collections.Generic;
namespace TestDictStringObject
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, object> currentViews = new Dictionary<string, object>();
StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view1");
StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view2");
StringHelpers.SafeDictionaryAdd(currentViews, "Employees", "view1");
StringHelpers.SafeDictionaryAdd(currentViews, "Reports", "view1");
foreach (KeyValuePair<string, object> pair in currentViews)
{
Console.WriteLine("{0} {1}", pair.Key, pair.Value);
}
Console.ReadLine();
}
}
public static class StringHelpers
{
public static void SafeDictionaryAdd(Dictionary<string, object> dict, string key, object view)
{
if (!dict.ContainsKey(key))
{
dict.Add(key, view);
}
else
{
dict[key] = view;
}
}
}
}
Como de costumbre, John Skeet entra allí con la velocidad de la luz con la respuesta correcta, pero curiosamente también podría haber escrito su SafeAdd como un Método de extensión en IDictionary.
public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...
Qué hay de malo en...
dict[key] = view;
Automáticamente agregará la clave si no existe.
Simplemente use el indexador; sobrescribirá si ya está allí, pero no tiene que estar allí primero:
Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";
Básicamente, use Add
si la existencia de la clave indica un error (por lo que desea arrojar) y el indexador de lo contrario. (Es un poco como la diferencia entre el casting y el uso as
para las conversiones de referencia).
Si está utilizando C # 3 y tiene un conjunto distinto de claves , puede hacerlo aún más nítido:
var currentViews = new Dictionary<string, object>()
{
{ "Customers", "view2" },
{ "Employees", "view1" },
{ "Reports", "view1" },
};
Sin embargo, eso no funcionará en su caso, ya que los inicializadores de colecciones siempre usan Add
lo que arrojará en la segunda entrada de Customers
.
simplemente
dict[key] = view;
De la documentación de MSDN de Dictionary.Item
El valor asociado con la clave especificada. Si no se encuentra la clave especificada, una operación get arroja una KeyNotFoundException y una operación set crea un nuevo elemento con la clave especificada .
Mi énfasis