Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование классов TRange и TComparer для проверки диапазонов значений в Delphi и Pascal

Delphi , Синтаксис , Сортировка

 

В данной статье мы рассмотрим, как использовать классы 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-04 00:24:32/0.005720853805542/0