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


вы почти там. Так как я не знаю, что MyType вам может потребоваться изменить вызов на ваш


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 метод.