Delphi麻烦:排序Tobjectlist <>

sum*_*ame 8 delphi sorting generics tobjectlist delphi-2010

我想使用内置的排序方法对我的通用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;
Run Code Online (Sandbox Code Playgroud)

我的Comparer函数如下所示:

function Comparer(Item1, Item2 : pointer):integer;
begin
  result := myCompare(item1, item2);
end;
Run Code Online (Sandbox Code Playgroud)

根据规格,它应该像这样工作.

我得到一个编译器错误E2250 没有这些参数存在'Sort'的重载版本(确切的措辞不同,我使用非英文版的RAD Studio)

我不知道为什么这不应该是有效的Pascal - 你们中的任何人都有洞察力分享这个吗?

Leo*_*era 8

你快到了.因为我不知道MyType您可能需要更改对myCompare函数的调用.

myList.Sort(TComparer<MyType>.Construct(
   function (const L, R: MyType): integer
   begin
     result := myCompare(L, R);
   end
));
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 6

TObjectList<T>.Sort 声明为:

procedure Sort(const AComparer: IComparer<T>);
Run Code Online (Sandbox Code Playgroud)

IComparer<T> 定义为:

IComparer<T> = interface
  function Compare(const Left, Right: T): Integer;
end;
Run Code Online (Sandbox Code Playgroud)

您正在实例化TObjectList<MyType>,因此您需要传递IComparer<MyType>Sort.为此,您需要一个对象来提供该接口的具体实现.

一个显而易见的方法是TObjectList<MyType>在那里继承并实现接口.

另一种方法是使用其类函数TComparer<T>创建IComparer<T>按需Construct.您需要提供比较功能:

TComparison<T> = reference to function(const Left, Right: T): Integer;
Run Code Online (Sandbox Code Playgroud)

莱昂纳多的回答演示了如何做到这一点.