В данной статье мы рассмотрим, как отсортировать список записей с использованием пользовательского сравнителя в Delphi. Для этого мы создадим простую запись и список на основе этой записи, а затем напишем пользовательскую функцию сравнения для сортировки списка по значению целого числа.
Создание записи и списка
Сначала создадим простую запись TMyRecord с полями str1, str2 и intVal:
type
TMyRecord = record
str1: string;
str2: string;
intVal: integer;
end;
Затем создадим generic список TListMyRecord на основе нашей записи:
type
TListMyRecord = TList<TMyRecord>;
Пользовательская функция сравнения
Теперь напишем пользовательскую функцию сравнения для сортировки списка по значению поля intVal. Функция должна принимать два параметра типа TMyRecord и возвращать значение типа Integer, которое будет использоваться для сравнения:
function CompareIntVal(const Left, Right: TMyRecord): Integer;
begin
Result := Left.intVal - Right.intVal;
end;
Сортировка списка
Теперь можно отсортировать список MyList по значению поля intVal с помощью функции Sort и нашего пользовательского сравнителя CompareIntVal:
Вот полный пример кода, демонстрирующий создание списка записей, добавление элементов в список и сортировку списка с использованием пользовательского сравнителя:
program SortListOfRecords;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
Generics.Collections;
type
TMyRecord = record
str1: string;
str2: string;
intVal: integer;
end;
TListMyRecord = TList<TMyRecord>;
function CompareIntVal(const Left, Right: TMyRecord): Integer;
begin
Result := Left.intVal - Right.intVal;
end;
var
MyList: TListMyRecord;
MyRecord: TMyRecord;
i: Integer;
begin
// Создание списка записей
MyList := TListMyRecord.Create;
// Добавление элементов в список
for i := 0 to 9 do
begin
MyRecord.str1 := 'String ' + IntToStr(i);
MyRecord.str2 := 'Another string';
MyRecord.intVal := i;
MyList.Add(MyRecord);
end;
// Сортировка списка по значению поля intVal с помощью пользовательского сравнителя
MyList.Sort(TComparer<TMyRecord>.Construct(CompareIntVal));
// Вывод отсортированного списка
for i := 0 to MyList.Count - 1 do
Writeln(MyList[i].str1, ' ', MyList[i].intVal);
// Освобождение ресурсов
MyList.Free;
Readln;
end.
После запуска этой программы вы увидите отсортированный список записей, основанный на значении поля intVal.
В данной статье рассматривается сортировка списка записей с использованием пользовательского сравнителя в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS