C # SortedList, получение значения по ключу - PullRequest
3 голосов
/ 19 ноября 2011

У меня есть SortedList в порядке убывания.

public class MyComparer : IComparer<int>
    {
        public int Compare(int x, int y)
        {
            if (x.CompareTo(y) > 0)
                return -1;
            return 1;
        }
    }
class Program
{
        static void Main(string[] args)
        {
            SortedList<int, bool> myList = new SortedList<int, bool>(new MyComparer());
            myList.Add(10, true);
            bool check = myList[10];//In this place an exception "Can't find key" occurs
        }
}

Когда SortedList создан без моего собственного IComparer, код работает нормально и исключений не возникает.

1 Ответ

7 голосов
/ 19 ноября 2011

Реализация компаратора недействительна;он нарушает требование:

x.CompareTo(x) == 0 

Это сбивает с толку отсортированный список, когда он пытается найти точное совпадение для данного ключа.

Вот простое исправление:

public int Compare(int x, int y)
{  
    return y.CompareTo(x); // Reverses the in-built comparison.
}

Но если вы хотите решить эту проблему более широко, рассмотрите возможность создания ReverseComparer<T>, такого как приведенный здесь .

...