簡體   English   中英

集合作為字典中的關鍵字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM