在 Java 中,可以在向 hashmap 添加元素的同時增加或減少一行中的數值。有沒有辦法在 C# Dictionary 中做到這一點?
例如在 Java 中:
hashMap.put(key, hashMap.getOrDefault(key, 0) 1);
在 C# 中:
if (dictionary.ContainsKey(key)) dictionary[key] ;
else dictionary.Add(key, 1);
uj5u.com熱心網友回復:
?在 .NET 6 中,不僅可以在一行中完成,還可以只使用一次哈希碼查找:
CollectionsMarshal.GetValueRefOrAddDefault(dictionary, key, out _) ;
System.Runtime.InteropServices.CollectionsMarshal.GetValueRefOrAddDefault方法:
獲取對指定字典中的 a 的參考,
TValue如果鍵不存在,則添加具有默認值的新條目。
uj5u.com熱心網友回復:
一種形式:
dictionary[key] = dictionary.ContainsKey(key) ? dictionary[key] 1 : 1;
另一種形式:
dictionary[key] = dictionary.TryGetValue(key, out var x) ? x 1 : 1;
還有一種形式:
if(!dictionary.TryAdd(key, 1)) dictionary[key] ;
接近你的Java:
dictionary[key] = dictionary.GetValueOrDefault(key, 0) 1;
請注意,這些方法的可用性因 .net 的版本和風格而異 - 上面的示例按“自開始時可用”到“最近可用”的粗略順序排列 -
在 C#中,如果您的版本沒有您想要的某些功能,沒有什么能阻止您撰寫GetValueOrDefault / TryAdd / TryGetValue擴展。您不必子類 Dictionary 來添加它,請參閱此處以獲取撰寫擴展方法以添加 GetValueOrDefault 的示例
uj5u.com熱心網友回復:
有擴展方法GetValueOrDefault,所以如果你對Java版本沒問題,你可以很容易地移植它。
請注意,此單個陳述句將進行兩次查找。在性能關鍵代碼中或處理大量資料時,您可以考慮在 int 值上存盤簡單的包裝器/持有者,并在一次搜索/查找中提取或添加插槽,然后簡單地增加值而無需再次重新搜索。
uj5u.com熱心網友回復:
public bool TryAdd(TKey key, TValue value);
為了不犯錯誤,您可以這樣做。
public bool TryAdd(TKey key, TValue value)
{
if (ContainsKey(key)) return false;
Add(key, value);
return true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463379.html
