Al crear la lista, puede pasarla a un comparador. Hay algunas clases de comparación en la unidad Generics.Defaults donde puede pasar un método anónimo para comparar dos elementos. Se usan para varios métodos, como IndexOf, Contains u Sort.
Ejemplo:
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;
I lo vi pero no está claro para mí. BinarySearch está solicitando una instancia del objeto que se busca. No veo cómo esto puede ayudar cuando estoy buscando el objeto pasando una cadena. –
Tiene que pasar un comparador personalizado, que realiza la comparación basada únicamente en el campo de cadena. –
Eso es lo que estaba pensando. Pero, no estoy seguro de cómo hacerlo. Todos los TComparers de muestra que he visto hablan sobre la clasificación de TList <>. Ninguno sobre buscar ¿Tendría un ejemplo? –