SortedDictionary дубликаты ключей? - PullRequest
0 голосов
/ 13 апреля 2011

Хорошо, у меня есть следующий метод:

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

Чего я надеюсь добиться, так это отсортировать записи в «recs» с новым правилом, заданным «myComparer», которое реализует IComparer. Это в значительной степени так, но я получаю исключение со следующим сообщением:

Запись с таким же ключом уже существует.

Мне интересно, как это возможно, поскольку "recs" - это уже словарь с ключами около 130 тыс.


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

(это всего лишь фрагмент кода ..)

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Если «recs» имеет другой компаратор, чем тот, который вы вводите в записи, вы можете получить дубликаты; то есть, если «recs» сравнивает по ссылке на объект, а myComparer сравнивает фактические байты, у вас будут коллизии.

0 голосов
/ 13 апреля 2011

Вы должны использовать тот же объект 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 голосов
/ 13 апреля 2011

Проверьте код сравнения:

Каждый ключ в SortedDictionary (Of TKey, TValue) должен быть уникальным в соответствии указанному компаратору; поэтому каждый ключ в исходном словаре также должен быть уникальный в соответствии с указанным сравнителем.

с вашим новым компаратором, 2 разных ключа с нормальным byte[] сравнением могут стать равными.

Это то, что MSDN говорит ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...