Проблема Delphi: сортировка списка объектов <> - PullRequest
8 голосов
/ 24 января 2011

Я хочу отсортировать свой общий список объектов, используя встроенный метод сортировки.

вот что я делаю:

//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 Не существует перегруженной версии 'Sort' с этими параметрами (точная формулировка отличается, я использую неанглийскую версию RAD Studio)

Понятия не имею, почему это не должно быть действительным, Паскаль. Кто-нибудь из вас может рассказать об этом?

Ответы [ 3 ]

8 голосов
/ 24 января 2011

Вы почти у цели. Поскольку я не знаю, что такое MyType, возможно, вам придется изменить вызов на myCompare функцию.

myList.Sort(TComparer<MyType>.Construct(
   function (const L, R: MyType): integer
   begin
     result := myCompare(L, R);
   end
));
6 голосов
/ 24 января 2011

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> в Sort. Для этого вам понадобится объект, обеспечивающий конкретную реализацию этого интерфейса.

Один очевидный способ сделать это - создать подкласс TObjectList<MyType> и реализовать там интерфейс.

Другой способ сделать это - использовать TComparer<T> для создания IComparer<T> по требованию с помощью функции класса Construct. Вам нужно будет предоставить функцию сравнения:

TComparison<T> = reference to function(const Left, Right: T): Integer;

Ответ Леонардо демонстрирует, как это сделать.

4 голосов
/ 24 января 2011

Если компилятор сообщает, что перегруженной версии с этим типом параметра не существует, спросите себя, какие существуют перегрузки do .Проверьте исходный код или документацию , чтобы узнать.

Там вы увидите, что TObjectList<T> наследует два Sort метода от TList<T>.Один не принимает аргументов, а другой ссылается на что-то, реализующее интерфейс IComparer<T>.Ваша автономная функция не подходит для этого.Напишите потомок TComparer<MyType> и переопределите его Compare метод.

...