我們可以寫一個GetOrAdd
方法,要麼得到值特定關鍵,如果它的存在,或者如果沒有,則分配一個新值:
public static TValue GetOrAdd<TKey, TValue>(
this Dictionary<TKey, TValue> dictionary,
TKey key,
TValue newValue)
{
TValue oldValue;
if (dictionary.TryGetValue(key, out oldValue))
return oldValue;
else
{
dictionary.Add(key, newValue);
return newValue;
}
}
(請注意,您可以創建一個接受第二超載。一個Func<TValue>
代替TValue
,如果值是昂貴創建或引起副作用,這是有用)
現在,這個問題就變得非常簡單:
var dictionary = new Dictionary<int, Dictionary<int, string>>();
dictionary.GetOrAdd(key1, new Dictionary<int, string>())[key2] = value;
我們獲取外鍵的內部字典,或者創建一個新的空字符(如果它不存在),然後我們將新值賦給返回的字典。請注意,索引器將添加一個項目,如果它不存在或更新該項目,如果它已經。
當然秤這相當好,因爲我們添加尺寸以及:
var dictionary = new Dictionary<int, Dictionary<int, Dictionary<int, string>>>();
dictionary.GetOrAdd(key1, new Dictionary<int, Dictionary<int, string>>())
.GetOrAdd(key2, new Dictionary<int, string>())[key3] = value;
在我們的例子中,我們實際上是罰款一直在增加使用我們的GetOrAdd
方法TValue
的默認值,所以如果我們添加一個過載支持:
public static TValue GetOrAdd<TKey, TValue>(
this Dictionary<TKey, TValue> dictionary,
TKey key)
where TValue : new()
{
TValue oldValue;
if (dictionary.TryGetValue(key, out oldValue))
return oldValue;
else
{
var newValue = new TValue();
dictionary.Add(key, newValue);
return newValue;
}
}
它更簡化了代碼:
dictionary.GetOrAdd(key1).GetOrAdd(key2)[key3] = value;
如果你真的最終做這個特定的操作很多,你可以創建做這件事的方法:
public static void AddMany<TKey1, TKey2, TKey3, TValue>(
this Dictionary<TKey1, Dictionary<TKey2, Dictionary<TKey3, TValue>>> dictionary,
TKey1 key1,
TKey2 key2,
TKey3 key3,
TValue newValue)
{
dictionary.GetOrAdd(key1).GetOrAdd(key2)[key3] = newValue;
}
允許你寫:
dictionary.AddMany(key1, key2, key3, value);
當然,您需要爲每個要支持的密鑰創建一個新的AddMany
重載,並且它必須是編譯時已知的數字,但在您的示例中似乎確實如此。
在我看來,你需要一個更好定義的對象來管理這些數據... – jaywayco 2014-11-06 20:46:53
程序員有時會編寫類。 – Stilgar 2014-11-06 20:47:22
與帶有key1,key2,key3組合的字典不一樣嗎? – 2014-11-06 20:52:53