Delphi麻烦:对Tobjectlist进行排序<>

时间:2011-01-24 16:20:46

标签: delphi sorting generics delphi-2010 tobjectlist

我想使用内置的排序方法对我的通用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 - 你们中的任何人都有洞察力分享这个吗?

3 个答案:

答案 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方法。

相关问题