Ответ 1
Я думаю, вы хотите:
myList.Sort( delegate (MyType t1, MyType t2)
{ return (t1.ID.CompareTo(t2.ID)); }
);
Для сортировки вам нужно что-то другое, кроме "true/false", вам нужно знать, равно ли оно больше или меньше.
Я пытаюсь сортировать список, используя делегаты, но я получаю ошибку соответствия подписи. Компилятор говорит, что я не могу преобразовать из "анонимного метода"
List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );
Что мне не хватает?
Вот несколько ссылок, которые я нашел, и они делают это одинаково.
Справочник разработчика Fusion
Я думаю, вы хотите:
myList.Sort( delegate (MyType t1, MyType t2)
{ return (t1.ID.CompareTo(t2.ID)); }
);
Для сортировки вам нужно что-то другое, кроме "true/false", вам нужно знать, равно ли оно больше или меньше.
Сорт не принимает двоичный предикат, он принимает делегат Comparison<T>
, который возвращает int
не a bool
.
Возвращаемые значения 0
, если элементы равны, <0
, когда первый элемент меньше второго, и >0
, когда первый элемент больше второго.
В будущем, если вы хотите отлаживать такие проблемы, я рекомендую вывести определение делегата из вызова Sort, например:
Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);
Таким образом, вы можете увидеть, есть ли проблема в вызове метода или в определении вашего делегата. Некоторые люди предпочитают оставить его таким образом (с более описательным именем, чем "c", очевидно), чтобы сделать код более читаемым. Я мог бы взять его или оставить его = -)
Убедитесь, что ваше свойство ID является типом данных по умолчанию, например Int или String. Если идентификатор является ссылочным типом объекта, этот объект должен реализовывать IComparer или IComparer.
Извините за предыдущую запись. Редактор не принимает < и > символов, и я не заметил предварительный просмотр прямо под редактором. Если свойство ID является типом объекта, объект должен реализовать IComparer или IComparer <T> .
Способ 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));