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 - 你们中的任何人都有洞察力分享这个吗?
你快到了.因为我不知道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)
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)
莱昂纳多的回答演示了如何做到这一点.