SortedDictionary重复键?

时间:2011-04-13 13:27:38

标签: c# c#-4.0

Okai,我有以下方法:

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

我希望实现的是使用由实现IComparer的“myComparer”指定的新规则对“recs”中的记录进行排序。它几乎是这样做的,但是我遇到了一个例外,其中包含以下消息:

  

具有相同密钥的条目   存在。

我想知道这是怎么可能的,因为“recs”已经是一个大约130k键的字典。


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

(它只是一个snipette ..)

3 个答案:

答案 0 :(得分:1)

如果“recs”的比较器与您注入记录的比较器不同,则可能会出现重复;也就是说,如果“recs”通过对象引用进行比较并且myComparer比较实际字节,则会发生冲突。

答案 1 :(得分:0)

检查比较器代码:

  

SortedDictionary中的每个键(Of   TKey,TValue)必须是独一无二的   到指定的比较器;因此,源词典中的每个键也必须是   根据指定的比较器唯一。

使用新的比较器,2个具有正常byte[]比较的不同键可能变得相等。

这就是msdn says...

答案 2 :(得分: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方法的代码吗?