Проблема Delphi: сортировка списка Tobjectlist
Я хочу отсортировать свой общий tobjectlist с помощью встроенного метода сортировки.
вот что я делаю:
//create the list object
myList := TObjectList<MyType>.Create(false);
[...] //populate the list with unsorted entries
//sort the list
myList.sort(@Comparer);
[...]//store sorted results back to array
myList.Destroy;
моя функция сравнения выглядит так:
function Comparer(Item1, Item2 : pointer):integer;
begin
result := myCompare(item1, item2);
end;
согласно спецификациям, он должен работать так.
Я получаю ошибку компилятора E2250 нет перегруженной версии "сортировки" с этими параметрами (точная формулировка отличается, я использую не английскую версию RAD Studio)
Я понятия не имею, почему это не должен быть действительным Паскаль - у кого-нибудь из вас есть понимание, чтобы поделиться этим?
3 ответов
TObjectList<T>.Sort объявляется как:
procedure Sort(const AComparer: IComparer<T>);
IComparer<T> определено как:
IComparer<T> = interface
function Compare(const Left, Right: T): Integer;
end;
вы создаете экземпляр TObjectList<MyType> и поэтому вам нужно пройти IComparer<MyType> to Sort. Для этого вам понадобится объект, обеспечивающий конкретную реализацию этого интерфейса.
один очевидный способ сделать это - подкласс TObjectList<MyType> и реализовать интерфейс есть.
другой способ сделать это-использовать TComparer<T> создать IComparer<T> на требовать с помощью its Construct функции класса. Вам нужно будет предоставить функцию сравнения:
TComparison<T> = reference to function(const Left, Right: T): Integer;
ответ Леонардо демонстрирует, как это сделать.
если компилятор говорит, что нет перегруженной версии с этим типом параметра, спросите себя, какие перегрузки do. Проверьте исходный код или документация чтобы выяснить.
там вы увидите, что TObjectList<T> наследует два Sort методы TList<T>. Один не принимает аргументов, а другой принимает ссылку на что-то, реализующее IComparer<T> интерфейс. Ваша автономная функция не подходит для этого. Написать потомка TComparer<MyType> и переопределить его Compare метод.