Подтвердить что ты не робот

Сортировка проблем с использованием делегатов

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

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

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

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

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

Ссылка на Microsoft

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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));