program ComparerAggregate;
{$APPTYPE CONSOLE}
uses
Generics.Defaults,
Spring.Collections,
SysUtils;
type
TPerson = record
FirstName: string;
LastName: string;
City: string;
constructor Create(const firstName, lastName, city: string);
end;
{ TPerson }
constructor TPerson.Create(const firstName, lastName, city: string);
begin
Self.FirstName := firstName;
Self.LastName := lastName;
Self.City := city;
end;
procedure Main;
var
persons: IList<TPerson>;
person: TPerson;
comparers: IList<TComparison<TPerson>>;
compareFirstName, compareLastName, compareCity, comparePerson: TComparison<TPerson>;
begin
persons := TCollections.CreateList<TPerson>;
comparers := TCollections.CreateList<TComparison<TPerson>>;
compareFirstName :=
function(const left, right: TPerson): Integer
begin
Result := CompareText(left.FirstName, right.FirstName);
end;
compareLastName :=
function(const left, right: TPerson): Integer
begin
Result := CompareText(left.LastName, right.LastName);
end;
compareCity :=
function(const left, right: TPerson): Integer
begin
Result := CompareText(left.City, right.City);
end;
comparePerson :=
function(const left, right: TPerson): Integer
var
comparer: TComparison<TPerson>;
begin
Result := 0;
for comparer in comparers do
begin
Result := comparer(left, right);
if Result <> 0 then
Break;
end;
end;
persons.AddRange([
TPerson.Create('Hans', 'Meier', 'Muenchen'),
TPerson.Create('Hans', 'Meier', 'Berlin'),
TPerson.Create('Bernd', 'Meier', 'Duesseldorf'),
TPerson.Create('Franz', 'Schulz', 'Hamburg'),
TPerson.Create('Hans', 'Mueller', 'Hamburg')
]);
// sort by lastname, firstname, city
comparers.AddRange([compareLastName, compareFirstName, compareCity]);
persons.Sort(comparePerson);
for person in persons do
Writeln(person.LastName, ' ', person.FirstName, ' ', person.City);
Writeln;
// sort by city, lastname, firstname
comparers.Clear;
comparers.AddRange([compareCity, compareLastName, compareFirstName]);
persons.Sort(comparePerson);
for person in persons do
Writeln(person.LastName, ' ', person.FirstName, ' ', person.City);
end;
begin
Main;
Readln;
end.