我想使用内置的排序方法对我的通用ashjectlist进行排序。
这就是我的所作所为:
//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;
我的Comparer功能如下所示:
function Comparer(Item1, Item2 : pointer):integer;
begin
result := myCompare(item1, item2);
end;
根据规格,它应该像这样工作。
我收到编译器错误E2250 这些参数没有存在'Sort'的重载版本(确切的措辞不同,我使用非英文版的RAD Studio)
我不知道为什么这不应该是有效的Pascal - 你们中的任何人都有洞察力分享这个吗?
答案 0 :(得分:8)
你快到了。由于我不知道MyType
是什么,您可能需要更改对myCompare
功能的调用。
myList.Sort(TComparer<MyType>.Construct(
function (const L, R: MyType): integer
begin
result := myCompare(L, R);
end
));
答案 1 :(得分: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>
传递给Sort
。为此,您需要一个对象来提供该接口的具体实现。
这样做的一个显而易见的方法是继承TObjectList<MyType>
并在那里实现接口。
另一种方法是使用TComparer<T>
使用IComparer<T>
类函数按需创建Construct
。您需要提供比较功能:
TComparison<T> = reference to function(const Left, Right: T): Integer;
莱昂纳多的回答说明了如何做到这一点。
答案 2 :(得分:4)
如果编译器说没有包含该参数类型的重载版本,请问自己存在 do 的重载。检查源代码或the documentation以查找。
您会看到TObjectList<T>
从Sort
继承了两个TList<T>
方法。一个没有参数,另一个参考实现IComparer<T>
接口的东西。您的独立功能不适合。写下TComparer<MyType>
的后代并覆盖其Compare
方法。