Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我可以为TObjectList.IndexOf传入一个函数,为TObjectList.Sort传入另一个函数吗?_Delphi_Function_Sorting_Indexof_Tobjectlist - Fatal编程技术网

Delphi 我可以为TObjectList.IndexOf传入一个函数,为TObjectList.Sort传入另一个函数吗?

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

总结:

TList.IndexOf(在unit Classes.pas中定义的TList)通过包含的项进行线性迭代,并比较引用。TList.IndexOf(在unit Generics.Collections.pas中定义的TList)也会在包含的项中进行线性迭代,但会使用比较器来比较这些项是否相等

TList.Sort和TList.Sort都可以使用比较器

=================================================

对于以下单元中定义的TForceList类型的实例,我可以使用

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是一种线性搜索,总是比较引用。如果你有