2011-04-13 85 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