Delphi 我可以为TObjectList.IndexOf传入一个函数,为TObjectList.Sort传入另一个函数吗?
总结: TList.IndexOf(在unit Classes.pas中定义的TList)通过包含的项进行线性迭代,并比较引用。TList.IndexOf(在unit Generics.Collections.pas中定义的TList)也会在包含的项中进行线性迭代,但会使用比较器来比较这些项是否相等 TList.Sort和TList.Sort都可以使用比较器 ================================================= 对于以下单元中定义的TForceList类型的实例,我可以使用Delphi 我可以为TObjectList.IndexOf传入一个函数,为TObjectList.Sort传入另一个函数吗?,delphi,function,sorting,indexof,tobjectlist,Delphi,Function,Sorting,Indexof,Tobjectlist,总结: TList.IndexOf(在unit Classes.pas中定义的TList)通过包含的项进行线性迭代,并比较引用。TList.IndexOf(在unit Generics.Collections.pas中定义的TList)也会在包含的项中进行线性迭代,但会使用比较器来比较这些项是否相等 TList.Sort和TList.Sort都可以使用比较器 ================================================= 对于以下单元中定义的TForceLis
instance.Sort(@ForceCompare);
使用其值字段作为排序条件对其进行快速排序。然而,当我打电话时
instance.IndexOf(AnotherInstance)
我想使用它的ElementZ字段作为比较标准,即ForceEqual
函数。我想知道如何才能做到这一点
PS:如果使用泛型集合,我想我可以使用
TList<TForce>.Create(TComparer<TForce>.Construct(ForceEqual));
不适用于标准的TObjectList。它(实际上是基TList)是为了支持使用CustomSort的自定义排序函数而编写的,但是对于自定义IndexOf没有这样的规定。当然,您可以编写自己的实现,以这种方式工作。不使用标准的TObjectList。它(实际上是基TList)是为了支持使用CustomSort的自定义排序函数而编写的,但是对于自定义IndexOf没有这样的规定。当然,您可以编写自己的实现,以这种方式工作。非泛型的
TObjectList
使用TList.IndexOf
,它只需迭代内部数组并比较指针
同样,通用的TObjectList
使用TList.IndexOf
,它使用IComparer
TList.Sort
使用创建列表时指定的TArray.Sort
传入任何IComparer
比较器是私有的,仅在列表构造函数中分配,因此我看不到一种简单的方法来重写此行为
使现代化
TList
提供并重载了接受比较器作为参数的Sort
,而无需修改专用比较器。因此,您可以使用一个比较器进行排序,而indexof可以使用另一个比较器。非泛型的TObjectList
使用TList.indexof
,它只需迭代内部数组并比较指针
同样,通用的TObjectList
使用TList.IndexOf
,它使用IComparer
TList.Sort
使用创建列表时指定的TArray.Sort
传入任何IComparer
比较器是私有的,仅在列表构造函数中分配,因此我看不到一种简单的方法来重写此行为
使现代化
TList
提供并重载了接受比较器作为参数的Sort
,而无需修改专用比较器。因此,您可以使用一个比较器进行排序,而indexof可以使用另一个比较器。排序方法背后的整个思想是它确实对列表进行排序。。。换句话说,在调用sort方法之后,列表中元素的物理顺序将更改以满足排序条件
IndexOf方法,正如您在自己的Delphi RTL代码中所看到的,只是一个通过引用返回第一个匹配元素的物理索引的线性搜索
返回的索引可用于检索列表上的对象,如下所示:
SomeIndex := AList.IndexOf(SomeObject);
//more code...
//you can re-use the reference...
//and maybe more...
SomeObject := AList[SomeIndex];
您将看到为什么IndexOf方法不应返回基于与列表的物理顺序不同的标准的索引。。。如果您首先调用Sort,则会发生这种情况,物理顺序反映了传递的排序条件
也就是说,看起来你可能想
- 维护两个不同的列表,使用不同的标准进行排序,并在适当时使用其中一个或另一个李>
- 根据应用程序在给定时间处理的操作的适用条件对列表重新排序
更高的性能取决于应用程序如何使用这些对象,它正在处理的数据量,甚至运行时进程可用的内存。排序方法背后的整个思想是它真的对列表进行排序。。。换句话说,在调用sort方法之后,列表中元素的物理顺序将更改以满足排序条件 IndexOf方法,正如您在自己的Delphi RTL代码中所看到的,只是一个通过引用返回第一个匹配元素的物理索引的线性搜索 返回的索引可用于检索列表上的对象,如下所示:
SomeIndex := AList.IndexOf(SomeObject);
//more code...
//you can re-use the reference...
//and maybe more...
SomeObject := AList[SomeIndex];
您将看到为什么IndexOf方法不应返回基于与列表的物理顺序不同的标准的索引。。。如果您首先调用Sort,则会发生这种情况,物理顺序反映了传递的排序条件
也就是说,看起来你可能想
- 维护两个不同的列表,使用不同的标准进行排序,并在适当时使用其中一个或另一个李>
- 根据应用程序在给定时间处理的操作的适用条件对列表重新排序
更高的性能取决于应用程序如何使用这些对象,它正在处理的数据量,甚至运行时进程可用的内存。IndexOf是否有多个有意义的实现?我认为最好告诉我们您要实现什么,看起来您需要两个顺序不同的列表,或者您不知道IndexOf是如何工作的sense@Xichen什么标准?看起来您可能希望维护两个单独的列表,按照不同的标准排序,并在适合您的需要时使用其中一个或另一个。另一种方法是对列表重新排序。无论如何,IndexOf是一种线性搜索,总是比较引用。如果你有