J'ai besoin d'ajouter des paires clé / objet à un dictionnaire, mais je dois bien sûr d'abord vérifier si la clé existe déjà, sinon j'obtiens une erreur " clé existe déjà dans le dictionnaire ". Le code ci-dessous résout cela mais est maladroit.
Quelle est la manière la plus élégante de faire cela sans créer une méthode d'assistance de chaîne comme celle-ci?
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;
}
}
}
}
la source
Quel est le problème avec...
Il ajoutera automatiquement la clé si elle est inexistante.
la source
dict[key] += amount
ne fonctionnera pas si la clé n'existe passimplement
À partir de la documentation MSDN de Dictionary.Item
Mon accent
la source
Comme d'habitude, John Skeet arrive avec une vitesse d'éclairage avec la bonne réponse, mais il est intéressant de noter que vous auriez également pu écrire votre SafeAdd en tant que méthode d'extension sur IDictionary.
la source
Bien que l'utilisation de l'indexeur soit clairement la bonne réponse à votre problème spécifique, une autre réponse plus générale au problème de l'ajout de fonctionnalités supplémentaires à un type existant serait de définir une méthode d'extension.
Évidemment, ce n'est pas un exemple particulièrement utile, mais quelque chose à garder à l'esprit pour la prochaine fois que vous trouverez un réel besoin:
la source