加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

实现TObjectList的自定义二进制搜索(Delphi XE)

发布时间:2020-12-15 09:17:23 所属栏目:大数据 来源:网络整理
导读:我需要在使用自定义比较器的TObjectList上实现二进制搜索,我相信使用TCustomComparer. 目标:二进制搜索返回列表中符合特定属性参数的实例. 例如: TMyClass=class public Index:integerend;TMyObjectList=TObjectListTMyClass;begin ... aMyClass.Index:=1;
我需要在使用自定义比较器的TObjectList上实现二进制搜索,我相信使用TCustomComparer.

目标:二进制搜索返回列表中符合特定属性参数的实例.

例如:

TMyClass=class
    public
     Index:integer
end;

TMyObjectList=TObjectList<TMyClass>;

begin
  ...
    aMyClass.Index:=1;
    aMyObjectList.binarysearch(aMyClass,aMyClassRef) 
  ...
end;

或者干脆:

begin
   ...
     aMyObjectList.binarysearch(1,aMyClassRef) 
   ...
 end;

我想循环并返回列表中也包含Index == 1的TMyClass实例.

在C中,重载’==’运算符可实现此目标.

新的Delphi’帮助’相当稀疏,分散在难以找到的东西周围,而且我并不熟悉新Delphi泛型的所有细微差别.

那么 – 我如何使用Generics.TObjectList在Delphi XE中执行此操作?

(使用Delphi XE).

TIA

解决方法

这里的帮助文件确实有点受限.我通常只是阅读Generics.Defaults和Generics.Collections的源代码.无论如何,您需要提供IComparer< TMyClass>.有很多方法可以做到这一点.例如,使用匿名函数:

var
  List: TObjectList<TMyClass>;
  Target: TMyClass;
  Index: Integer;
  Comparer: IComparer<TMyClass>;
  Comparison: TComparison<TMyClass>;
....    
Comparison :=
  function(const Left,Right: TMyClass): Integer
  begin
    //Result := ??;//your comparison rule goes here
  end;
Comparer := TComparer<TMyClass>.Construct(Comparison);
List.BinarySearch(Target,Index,Comparer);

如果您不想使用匿名函数,可以通过其他方式实现比较.例如,某个对象或类函数的方法,或者甚至只是普通的老式非OOP函数.它必须具有与上面相同的签名.

与比较函数一样,如果Left< Right,则返回< 0;如果Left>则返回0;如果Left = Right,则返回0.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读