2011-04-13 84 views
0

岡井,我有以下方法:SortedDictionary重複鍵?

public void Insert(SortedDictionary<byte[], uint> recs) 
{ 
    SortedDictionary<byte[], uint> records = new SortedDictionary(recs, myComparer); 
} 

我所希望實現的是記錄在「區域經濟共同體」與「myComparer」它實現的IComparer指定一個新的規則進行排序。它幾乎是這樣做的,但我遇到一個例外,並帶有以下消息:

存在具有相同密鑰的條目 。

我想知道這是如何可能的,因爲「recs」已經是一個約130k的字典。


public int Compare(byte[] a, byte[] b) 
    { 
     return Inhouse.ByteConverter.ToString(a).CompareTo( 
        Inhouse.ByteConverter.ToString(b)); 
    } 

(它只是一個snipette ..)

+0

是不是返回類型'SortedDictionary '而不是'SortedDictionary '? – 2011-04-13 13:31:37

+0

你應該發佈你的比較器的代碼,否則我們不能幫你這麼多...... – digEmAll 2011-04-13 13:40:22

+0

我爲比較器添加了一個代碼示例 – 2011-04-13 14:22:07

回答

1

如果「區域經濟共同體」具有不同的比較器比你注入你可能會得到重複記錄的一個;也就是說,如果「recs」通過對象引用進行比較,並且myComparer比較實際字節數,則會發生衝突。

0

檢查比較器的代碼:

在SortedDictionary(中 TKEY的,TValue)每個密鑰必須根據 到指定的比較是唯一的;因此,根據指定的比較器,源字典中的每個密鑰也必須是唯一的 。

與你的新的比較器,2正常byte[] comparaison不同的密鑰可能會變得相等。

這是MSDN says...

+0

有趣的事實,但我仍然不明白爲什麼會發生這種情況。比較器是否以某種方式更改密鑰? – 2011-04-13 14:14:19

+0

不,新字典會將您的比較器的鍵排序,但如果它找到與該比較器相同的兩個鍵,它會發出抱怨。當您嘗試在字典中多次添加相同的密鑰時(這種情況下的相同密鑰由默認比較器定義,並且由您的自定義比較器定義),情況也是如此。 – manji 2011-04-13 14:33:24

+0

在原始字典中搜索鍵'a'&'b',其中'a!= b'和'Inhouse.ByteConverter.ToString(a).CompareTo(Inhouse.ByteConverter。ToString(b))== 0' – manji 2011-04-13 14:35:42

0

您必須使用什麼調用方法相同Dictionary對象。所以,我想,你的代碼是這樣的:

SortedDictionary<byte[], uint> dic = new SortedDictionary<byte[], uint>(); 
foreach (var thing in things) 
{ 
    dic.Clear(); 
    Populate(dic); 
    Insert(dic); 
} 

,它應該是這樣的:

SortedDictionary<byte[], uint> dic = new SortedDictionary<byte[], uint>(); 
foreach (var thing in things) 
{ 
    dic = new SortedDictionary<byte[], uint>(); 
    Populate(dic); 
    Insert(dic); 
} 

您可以發佈與調用您的Insert方法的代碼?

+0

我不完全有權訪問調用範圍。 – 2011-04-13 14:10:52