Tho*_*ger 9 delphi generics tlist
可能重复:
如何在通用TList中搜索具有特定字段值的记录?
我有一个集合
TList<TActivityCategory>
Run Code Online (Sandbox Code Playgroud)
TActivityCategory有一个String类型的Name属性,我想使用Name属性搜索TList.
我在TList <>中看到了BinarySearch,但这需要一个TActivityCategory实例.我只想传递一个名字的字符串.
我该怎么做呢?
创建列表时,您可以传入比较器。在 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)