Muszę dodać pary klucz / obiekt do słownika, ale oczywiście najpierw muszę sprawdzić, czy klucz już istnieje, w przeciwnym razie pojawia się błąd „ klucz już istnieje w słowniku ”. Poniższy kod rozwiązuje ten problem, ale jest niezgrabny.
Jaki jest bardziej elegancki sposób zrobienia tego bez tworzenia takiej metody pomocniczej dla stringów?
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;
}
}
}
}
źródło
Co jest źle z...
Automatycznie doda klucz, jeśli nie istnieje.
źródło
dict[key] += amount
nie zadziała, jeśli klucz nie istniejepo prostu
Z dokumentacji MSDN Dictionary.Item
Mój nacisk
źródło
Jak zwykle John Skeet dostaje się tam z szybkością oświetlenia z właściwą odpowiedzią, ale co ciekawe, możesz również napisać SafeAdd jako metodę rozszerzenia w IDictionary.
źródło
Chociaż użycie indeksatora jest z pewnością właściwą odpowiedzią na konkretny problem, inną bardziej ogólną odpowiedzią na problem związany z dodaniem dodatkowej funkcjonalności do istniejącego typu byłoby zdefiniowanie metody rozszerzenia.
Oczywiście nie jest to szczególnie przydatny przykład, ale coś, o czym należy pamiętać, gdy następnym razem znajdziesz prawdziwą potrzebę:
źródło