[英]Collection as key in Dictionary
我有一本這樣的字典:
var dic = Dictionary<Collection<MyObject>, string>
然后我添加一個像這樣的條目:
dic.Add(myObjColl, "1");
其中myObjColl包含一個條目
在第二次運行中,我嘗試將另一個條目添加到dic中,其中myObjColl具有兩個條目(其中一個與第一次運行中的條目相同),並且我得到一個例外,表明密鑰已經存在。
我在這里想念什么? 我希望字典鍵是一個集合,並且肯定有兩個條目數不同的集合不能相同。
編輯:發生的事情是myObjColl在foreach之外初始化,並在第二次迭代中更新。 因此,我認為是具有兩個條目的NEW集合實際上是舊的一個條目集合,並添加了一個附加條目。
詳細說明我的問題:
我有一個產品行對象集合。 每個標識都有一個由一組鍵值對組成的產品標識對象:
Collection<ProductKeyValuePair> productIdentification;
myProductRow.ProductIdentification = productIdentification;
然后,我必須構造另一個ProductKeyValuePairs集合,以定義每個產品行對象的“所有者”(一個產品行對象可以具有多個所有者),並且需要將每個所有者添加到相應的產品行對象中。 一個傳統的多對多方法,其中公共密鑰是KeyValuePairs的集合。
很難解釋,但這實際上取決於從大型機上運行的舊系統返回的舊數據,並且很可能存儲在某種分層數據庫中:-/
字典中的鍵在履行其作為鍵的作用時應該是不變的。 如果您做任何更改GetHashCode()
或Equals(object)
的值的操作,則將得到未定義的行為。
(同樣,如果Collection
沒有實現GetHashCode()
和Equals(object)
來使用其包含的成員,則僅通過引用容器對象本身來進行比較)
它不是在檢查集合的內容。
它只是使用myObjColl
(由ref)作為鍵。
注意:將集合作為鍵是非常不尋常的。 鍵通常是字符串(或整數)。
要使像collection這樣的引用類型成為字典中的鍵,通常需要將自定義比較器( IEqualityComparer<TKey>
)傳遞給字典的構造函數 。 否則,將使用該類的默認Equals
/ GetHashCode
實現,該實現通常不具有值語義(即string
是行為類似於value的引用類型的示例)。
過於簡化的收集器比較器(沒有null檢查,僅比較計數)和用法如下:
class ListSameByCount<T> : EqualityComparer<List<T>>
{
public override bool Equals(List<T> b1, List<T> b2)
{
return b1.Count() == b2.Count();
}
public override int GetHashCode(List<T> b1)
{
return b1.Count().GetHashCode();
}
}
var dictionary = new Dictionary<List<int>, int>(new ListSameByCount<int>());
注意:集合在字典中通常不適合作為鍵的候選者,因為它們可能會發生突變(添加/刪除/更改的項目),結果哈希碼將更改,並且字典將無法找到鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.