Проблема сортировки списков с использованием делегатов - PullRequest
19 голосов
/ 23 октября 2008

Я пытаюсь отсортировать список с использованием делегатов, но получаю ошибку соответствия подписи. Компилятор говорит, что я не могу конвертировать из «анонимного метода»

List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );

Чего мне не хватает?

Вот некоторые ссылки, которые я нашел, и они делают это так же.

Справочник разработчика Fusion

Справочник Microsoft

Ответы [ 6 ]

47 голосов
/ 23 октября 2008

Я думаю, что вы хотите:

myList.Sort( delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
);

Для сортировки вам нужно что-то, кроме "true / false", вам нужно знать, равно ли оно, больше или меньше.

10 голосов
/ 23 октября 2008

Сортировка не принимает двоичный предикат, она принимает делегат Comparison<T>, который возвращает int, а не bool.

Возвращаемыми значениями являются 0 для случаев, когда элементы равны, <0 для случаев, когда первый элемент меньше второго, и >0 для случаев, когда первый элемент превышает второй.

3 голосов
/ 23 октября 2008

В будущем, если вы захотите отладить подобные проблемы, я бы рекомендовал исключить определение делегата из вызова Sort, например:

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);

Таким образом, вы можете увидеть, связана ли проблема с вызовом вашего метода или с определением вашего делегата. Некоторые люди предпочитают оставить это так (с более описательным именем, чем «c», очевидно), чтобы сделать код более читабельным. Я мог взять это или оставить это = -)

0 голосов
/ 23 октября 2008

Способ obj.Sort (делегат (...)); это динамическая сортировка в одном месте. Если у вас есть несколько мест, выполняющих одинаковую сортировку, или вам нужна более гибкая сортировка, вы можете создать класс, реализующий IComparer . Вот пример:

public class MyTypeComparer : IComparer<MyType>
{
  public MyTypeComparer() // default comparer on ID
  { ... }

  public MyTypeComparer(bool desc) // default with order specified

  public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false.
  { ... }

  public int Compare(MyType a, MyType b) // implement IComparer interface
  { ... } // this is real sorting codes
}

и вот пример для его использования:

List<MyType> myList = GetList();
myList.Sort(new MyTypeComparer());
// myList.Sort(new MyTypeComparer(false));
// myList.Sort(new MyTypeComparer("FirstName", true));
0 голосов
/ 23 октября 2008

Извините за предыдущий пост. Редактор не принимает символы <и>, и я не заметил предварительный просмотр прямо под редактором. Если свойство ID является типом объекта, объект должен реализовывать IComparer или IComparer .

0 голосов
/ 23 октября 2008

Убедитесь, что ваше свойство идентификатора имеет тип данных значения по умолчанию, например, Int или String. Если идентификатор является ссылочным типом объекта, этот объект должен реализовывать IComparer или IComparer.

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