Necesito agregar pares clave / objeto a un diccionario, pero, por supuesto, primero debo verificar si la clave ya existe; de lo contrario, aparece el error " clave ya existe en el diccionario ". El siguiente código resuelve esto, pero es torpe.
¿Cuál es una forma más elegante de hacer esto sin hacer un método auxiliar de cadena 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;
}
}
}
}
fuente
Qué hay de malo en...
Agregará automáticamente la clave si no existe.
fuente
dict[key] += amount
no funcionará si la clave no existesimplemente
De la documentación de MSDN de Dictionary.Item
Mi énfasis
fuente
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 método de extensión en IDictionary.
fuente
Aunque el uso del 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, pero es algo a tener en cuenta para la próxima vez que encuentre una necesidad real:
fuente