如何搜索通用TList< T>采集? [英] How do I search a generic TList<T> collection?

查看:104
本文介绍了如何搜索通用TList< T>采集?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


可能存在重复:

我如何在一般的TList中搜索具有特定字段值的记录?


我有一个收藏

 &的TList LT; TActivityCategory> 

TActivityCategory具有一个类型为string的Name属性,我想使用Name属性搜索TList。 / p>

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



我该如何去做这件事?

解决方案

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



示例:

 使用
Generics.Defaults,
Generics.Collections;

类型
TActivityCategory =类别
私人
FName:string;
public
构造函数Create(const Name:string);
属性名称:字符串读取FName写入FName;
end;

构造函数TActivityCategory.Create(const Name:string);
begin
FName:= Name;
end;

程序TForm1.Button1Click(发件人:TObject);
var
activities:TList< TActivityCategory>;
search:TActivityCategory;
begin
activities:= TObjectList< TActivityCategory> .Create(
TDelegatedComparer< TActivityCategory> .Create(
function(const Left,Right:TActivityCategory):Integer
begin
结果:= 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');
如果activities.Contains(搜索)然后
ShowMessage('found');

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


search.Name:='类别D';
如果不是activities.Contains(搜索)然后
ShowMessage('not found');

search.Free;
activities.Free;
end;


Possible Duplicate:
How can I search a generic TList for a record with a certain field value?

I have a collection of

TList<TActivityCategory>

TActivityCategory has a Name property of type string and I want to search the TList using the Name property.

I see BinarySearch in the TList<> but that would require an instance of TActivityCategory. I just want to pass the string for a name.

How would I go about doing this?

解决方案

When you create the list you can pass in a comparer. There are some comparer classes in the Generics.Defaults unit where you can pass in some anonymous method to compare two elements. They are used for several methods like IndexOf, Contains or Sort.

Example:

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;

这篇关于如何搜索通用TList&lt; T&gt;采集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆