9

我想使用内置的排序方法对我的通用 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)

我不知道为什么这不应该是有效的帕斯卡 - 你们有没有人对此有见识?

4

3 回答 3

8

你快到了。由于我不知道MyType您可能需要更改对myCompare函数的调用。

myList.Sort(TComparer<MyType>.Construct(
   function (const L, R: MyType): integer
   begin
     result := myCompare(L, R);
   end
));
于 2011-01-24T17:09:01.413 回答
6

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>按需。Construct您需要提供一个比较功能:

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

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

于 2011-01-24T16:40:36.000 回答
4

如果编译器说该参数类型不存在重载版本,请问问自己确实存在哪些重载。检查源代码或文档以找出答案。

在那里你会看到它TObjectList<T>继承了两个Sort方法TList<T>。一个不带参数,另一个引用实现IComparer<T>接口的东西。您的独立功能不适合。写一个后代TComparer<MyType>并覆盖它的Compare方法。

于 2011-01-24T16:41:05.533 回答