Проблема 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
метод.