Реализация IComparable с использованием Framework 2.0 - PullRequest
1 голос
/ 15 сентября 2011

Я пытаюсь провести рефакторинг приведенного ниже кода для платформы 2.0 (требуется на работе). Приведенный ниже код был любезно предоставлен в предыдущем посте , в котором я пытался выяснить, как сортировать словарь массивов. Это немного касательно этой дискуссии. Ниже приведен код:

 MultiDimDictList myDicList = new MultiDimDictList();
myDicList.Add("fly", a_fly);
myDicList.Add("img", a_img);
myDicList.Add("bar", a_bar);
myDicList.Add("meter", a_meter);
myDicList.Add("block", a_block);
myDicList.Add("popularity", a_pop); 

List<int> OrderedByPopularity = new List<int>();
ArrayList popList = myDicList["popularity"];

for (int i = 0; i < popList.Count; ++i)
{
    OrderedByPopularity.Add(i);
}

OrderedByPopularity.Sort((i1, i2) => 
{ 

    return popList[i2].CompareTo(popList[i1]); 

});

Когда я пытаюсь запустить приведенный выше код, самая нижняя логика вызывает у меня проблемы, а именно то, что «CompareTo» не распознается. Я немного прочитал об этом, и похоже, что мне нужно реализовать IComparable, чтобы заставить это работать, но я мог бы использовать некоторую помощь / предложения здесь. Где я должен реализовать IComparable? Кроме того, компилятор также говорит мне использовать «делегат» для моего метода .Sort. Я прав, что это должно выглядеть так: .Sort (делегат (int i1, int i2) =>?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

IComparable - это интерфейс, который вы реализуете для класса, который вы хотите быть ... сопоставимым. Метод Sort знает, как работать с интерфейсом IComparable сразу. Итак, из этого следует, что если вы хотите сортировать, используя метод Sort, ваш класс должен реализовать IComparable В противном случае, когда вы вызываете CompareTo для своего класса, как вы ожидаете, что алгоритм сортировки узнает, как ваш класс логически сортирует?

Это некоторая предыстория того, как работает IComparable, но не похоже, что это проблема здесь, если я не читаю. Похоже, вы пытаетесь:

  1. Заполните OrderedByPopularity связкой целых чисел.
  2. Сортировка целых чисел.

Если вы действительно хотите отсортировать целые числа в вашем списке, вам просто нужно использовать

(i1, i2) => 
{ 
    return i1.CompareTo(i2); 
}

int (который является типом элемента в List) уже имеет CompareTo.

Это отвечает на вопрос?

0 голосов
/ 15 сентября 2011

Проблема в том, что ArrayList возвращает объект.Объект не реализует IComparable.

Поэтому, когда вы говорите popList [i2] .CompareTo (бла), вы вызываете функцию для объекта, который не существует.

...