La mia domanda: c'è un modo canonico per creare un dizionario di dizionari e fornire una coppia di chiavi esterna / interna? Esiste un NugetPackage con un'implementazione?
Nel mio codice, ho ora alcuni luoghi in cui ho una proprietà come questa
private readonly IDictionary<string, IDictionary<string, SomeType>> _nestedDict =
new Dictionary<string, IDictionary<string, SomeType>>();
e ho creato metodi di estensione come questo
public static V AddOrUpdate<T, U, V>(
[NotNull] this IDictionary<T, IDictionary<U, V>> dictionary,
[NotNull] T outerKey,
[NotNull] U innerKey,
[NotNull] Func<V> addValueFactory,
[NotNull] Func<V, V> updateValueFactory,
[CanBeNull] IEqualityComparer<U> innerDictionaryComparer = null)
{
IDictionary<U, V> dict;
if (dictionary.TryGetValue(outerKey, out dict))
{
V currentValue;
if (dict.TryGetValue(innerKey, out currentValue))
{
var updatedValue = updateValueFactory(currentValue);
if (!object.ReferenceEquals(updatedValue, currentValue))
dict[innerKey] = updatedValue;
return updatedValue;
}
var addedValue1 = addValueFactory();
dict[innerKey] = addedValue1;
return addedValue1;
}
var addedValue = addValueFactory();
if (innerDictionaryComparer != null)
dictionary[outerKey] = new Dictionary<U, V>(innerDictionaryComparer) {{innerKey, addedValue}};
else
dictionary[outerKey] = new Dictionary<U, V> {{innerKey, addedValue}};
return addedValue;
}
Questo è potente, ma sto iniziando a sentire che dovrei semplicemente creare una classe per i dizionari nidificati. Ecco il mio pensiero:
- Il
addValueFactory
eupdateValueFactory
sono un po 'maldestri e sembra che stiano rompendo i principi OO. - Sto pensando di creare un
ConcurrentDictionary
diDictionary
s (o forse diConcurrentDictionary
s), e questo richiederebbe un maggior numero di metodi di estensione. Ho pensato che se lo sto usando così tanto, dovrei solo creare la classe darn e farla finita.
Che cosa dici?