如何搜索通用TList <T>集合?

Tho*_*ger 9 delphi generics tlist

可能重复:
如何在通用TList中搜索具有特定字段值的记录?

我有一个集合

TList<TActivityCategory>
Run Code Online (Sandbox Code Playgroud)

TActivityCategory有一个String类型的Name属性,我想使用Name属性搜索TList.

我在TList <>中看到了BinarySearch,但这需要一个TActivityCategory实例.我只想传递一个名字的字符串.

我该怎么做呢?

Ste*_*nke 5

创建列表时,您可以传入比较器。在 Generics.Defaults 单元中有一些比较器类,您可以在其中传入一些匿名方法来比较两个元素。它们用于多种方法,如 IndexOf、Contains 或 Sort。

例子:

uses
  Generics.Defaults,
  Generics.Collections;

type
  TActivityCategory = class
  private
    FName: string;
  public
    constructor Create(const Name: string);
    property Name: string read FName write FName;
  end;

constructor TActivityCategory.Create(const Name: string);
begin
  FName := Name;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  activities: TList<TActivityCategory>;
  search: TActivityCategory;
begin
  activities := TObjectList<TActivityCategory>.Create(
    TDelegatedComparer<TActivityCategory>.Create(
      function(const Left, Right: TActivityCategory): Integer
      begin
        Result := CompareText(Left.Name, Right.Name);
      end));

  activities.Add(TActivityCategory.Create('Category B'));
  activities.Add(TActivityCategory.Create('Category C'));
  activities.Add(TActivityCategory.Create('Category A'));

  search := TActivityCategory.Create('Category C');
  if activities.Contains(search) then
    ShowMessage('found');

  ShowMessageFmt('Index: %d', [activities.IndexOf(search)]);
  activities.Sort;
  ShowMessageFmt('Index: %d', [activities.IndexOf(search)]);


  search.Name := 'Category D';
  if not activities.Contains(search) then
    ShowMessage('not found');

  search.Free;
  activities.Free;
end;
Run Code Online (Sandbox Code Playgroud)