當您創建列表時,您可以傳入比較器。 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;
我看到一個,但我不清楚。 BinarySearch正在詢問正在搜索的對象的實例。當我通過傳遞一個字符串來查找對象時,我看不出這會如何幫助。 –
您必須傳遞一個自定義比較器,該比較器僅基於字符串字段執行比較。 –
這就是我的想法。但是,我不知道該怎麼去做。我見過的所有示例TComparers都討論了對TList <>進行排序。沒有關於搜索。你會碰巧有一個例子嗎? –