Wie Evgeny sagt, wird der Indexer ersetzen bereits Werte vorhanden - wenn Sie also nur bedingungslos den Wert für einen bestimmten Schlüssel einstellen möchten, können Sie tun
dictionary[key] = value;
Der interessantere Fall ist der "hole einen Wert, oder füge ihn bei Bedarf ein". Es ist einfach, mit einer Erweiterung Methode zu tun:
public static TValue GetOrCreateValue<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue value)
{
return dictionary.GetOrCreateValue(key,() => value);
}
public static TValue GetOrCreateValue<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary,
TKey key,
Func<TValue> valueProvider)
{
TValue ret;
if (!dictionary.TryGetValue(key, out ret))
{
ret = valueProvider();
dictionary[key] = ret;
}
return ret;
}
Beachten Sie die Verwendung eines Delegierten den Standardwert zu schaffen - die man Szenarien wie die „Liste als Wert“ erleichtert; Sie wollen nicht auf die leere Liste erstellen, es sei denn Sie müssen:
dict.GetOrCreateValue(key,() => new List<int>()).Add(item);
Beachten Sie auch, wie dies nur die Lookup einmal durchführt, wenn der Schlüssel bereits vorhanden ist - es gibt keine Notwendigkeit eine ContainsKey
und dann Blick zu tun up den Wert. Es erfordert jedoch immer noch zwei Lookups, wenn es den neuen Wert erstellt.
Ist 'Lookup' ein' ILookup '? Ich denke nicht, weil es keine 'ContainsKey'-Methode haben sollte. Ich bestätige nur, dass .NET die Suche nicht verändert hat, weil ich nach einem Weg gesucht habe, ein "ILookup" zu aktualisieren ... –
drzaus