Snippets

Stefan Glienke Comparer aggregation

Created by Stefan Glienke
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.

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.