В данной статье мы рассмотрим, как использовать классы TRange и TComparer для проверки значений в различных диапазонах в Delphi и Pascal. Эти классы позволяют легко определять, находится ли значение в заданном диапазоне, и предоставляют гибкость для использования различных компараторов.
Введение
В Delphi и Pascal часто возникает необходимость проверять, находится ли значение в определенном диапазоне. Это может быть целочисленное значение, дата, строка или даже сложный объект. Для решения этой задачи можно использовать класс TRange, который предоставляет методы для проверки значений в диапазоне с использованием стандартного или пользовательского компаратора.
Класс TRange
Класс TRange содержит два перегруженных метода IsIn, которые позволяют проверять, находится ли значение в заданном диапазоне.
type
TRange<T> = class
public
// Проверка, находится ли значение в диапазоне [aMin, aMax] с использованием пользовательского компаратора
class function IsIn(const aValue, aMin, aMax: T; const aComparer: IComparer<T>): Boolean; overload; static;
// Проверка, находится ли значение в диапазоне [aMin, aMax] с использованием стандартного компаратора
class function IsIn(const aValue, aMin, aMax: T): Boolean; overload; static;
end;
Реализация TRange
Класс TRange реализует два метода IsIn. Первый метод использует пользовательский компаратор, а второй — стандартный компаратор.
class function TRange<T>.IsIn(const aValue, aMin, aMax: T; const aComparer: IComparer<T>): Boolean;
begin
if not Assigned(aComparer) then
raise EArgumentNilException.Create('Comparer is not assigned.');
Result := (aComparer.Compare(aValue, aMin) >= 0) and (aComparer.Compare(aValue, aMax) <= 0);
end;
class function TRange<T>.IsIn(const aValue, aMin, aMax: T): Boolean;
begin
Result := IsIn(aValue, aMin, aMax, TComparer<T>.Default);
end;
Использование TRange
Давайте рассмотрим примеры использования класса TRange для проверки значений в различных диапазонах.
Целочисленные значения
if TRange<Integer>.IsIn(5, 1, 10) then
Writeln('5 is within the range [1, 10]')
else
Writeln('5 is outside the range [1, 10]');
if TRange<Integer>.IsIn(15, 1, 10) then
Writeln('15 is within the range [1, 10]')
else
Writeln('15 is outside the range [1, 10]');
Долгие целые числа
if TRange<Int64>.IsIn(5_000_000_000_000_000_001, 5_000_000_000_000_000_000, 5_000_000_000_000_000_010) then
Writeln('5_000_000_000_000_000_001 is within the range [5_000_000_000_000_000_000, 5_000_000_000_000_000_010]')
else
Writeln('5 is outside the range [5_000_000_000_000_000_000, 5_000_000_000_000_000_010]');
Дробные значения
if TRange<Double>.IsIn(7.5, 5.0, 10.0) then
Writeln('7.5 is within the range [5.0, 10.0]')
else
Writeln('7.5 is outside the range [5.0, 10.0]');
if TRange<Double>.IsIn(7.5, 7.6, 10.0) then
Writeln('7.5 is within the range [7.6, 10.0]')
else
Writeln('7.5 is outside the range [7.6, 10.0]');
Даты и время
if TRange<TDateTime>.IsIn(Today, Today, Today +10) then
Writeln('Today is within ['+Today.ToString+'] and ['+gEndDateStr+']')
else
Writeln('Today is outside ['+Today.ToString+'] and ['+gEndDateStr+']');
if TRange<TDateTime>.IsIn(Yesterday, Today, Today +10) then
Writeln('Yesterday is within ['+Today.ToString+'] and ['+gEndDateStr+']')
else
Writeln('Yesterday is outside ['+Today.ToString+'] and ['+gEndDateStr+']');
Строки
if TRange<string>.IsIn('hello', 'alpha', 'zulu') then
Writeln('"hello" is within the range [alpha, zulu]')
else
Writeln('"hello" is outside the range [alpha, zulu]');
if TRange<string>.IsIn('zulu', 'alpha', 'omega') then
Writeln('"zulu" is within the range [alpha, omega]')
else
Writeln('"zulu" is outside the range [alpha, omega]');
Точки (TPoint)
if TRange<TPoint>.IsIn(gPoint1, gPoint2, gPoint3, PointComparer) then
Writeln('Point(1, 2) is within the range [Point(0, 0), Point(3, 4)]')
else
Writeln('Point(1, 2) is outside the range [Point(0, 0), Point(3, 4)]');
if TRange<TPoint>.IsIn(Point(5, 5), Point(0, 0), Point(3, 4), PointComparer) then
Writeln('Point(5, 5) is within the range [Point(0, 0), Point(3, 4)]')
else
Writeln('Point(5, 5) is outside the range [Point(0, 0), Point(3, 4)]');
Объекты ICustomRecord
if TRange<ICustomRecord>.IsIn(gRec2, gRec1, gRec3, gRecordComparer) then
Writeln('Record is within the range')
else
Writeln('Record is outside the range');
gRec2.New.Edit('Mid', 40);
if TRange<ICustomRecord>.IsIn(gRec2, gRec1, gRec3, gRecordComparer) then
Writeln('Record is within the range')
else
Writeln('Record is outside the range');
Объекты IProduct
if TRange<IProduct>.IsIn(gProduct2, gProduct1, gProduct3, gProductComparer) then
Writeln('Product price is within the range')
else
Writeln('Product price is outside the range');
gProduct2.New.Edit(2, 40);
if TRange<IProduct>.IsIn(gProduct2, gProduct1, gProduct3, gProductComparer) then
Writeln('Product price is within the range')
else
Writeln('Product price is outside the range');
Объекты IClient
if TRange<IClient>.IsIn(gClient2, gClient1, gClient3, gClientComparer) then
Writeln('Client age is within the range')
else
Writeln('Client age is outside the range');
gClient2.New.Edit('Bob', 40);
if TRange<IClient>.IsIn(gClient2, gClient1, gClient3, gClientComparer) then
Writeln('Client age is within the range')
else
Writeln('Client age is outside the range');
Вывод
Класс TRange и интерфейс IComparer предоставляют мощные инструменты для проверки значений в различных диапазонах в Delphi и Pascal. Эти классы могут быть использованы для проверки значений различных типов, включая целочисленные значения, дробные значения, даты и время, строки, точки и сложные объекты. Использование пользовательских компараторов позволяет адаптировать поведение класса TRange под конкретные требования задачи.
Заключение
В данной статье мы рассмотрели, как использовать классы TRange и TComparer для проверки значений в различных диапазонах в Delphi и Pascal. Эти классы предоставляют гибкость и мощность, которые могут быть полезны для решения различных задач. Мы также рассмотрели примеры использования класса TRange для проверки значений различных типов, включая целочисленные значения, дробные значения, даты и время, строки, точки и сложные объекты. Использование пользовательских компараторов позволяет адаптировать поведение класса TRange под конкретные требования задачи.
Класс TRange в Delphi и Pascal позволяет проверять, находится ли значение в заданном диапазоне, с возможностью использования как стандартных, так и пользовательских компараторов для различных типов данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.