共享间隔,内置Delphi函数?

共享间隔,内置Delphi函数?,delphi,Delphi,我必须找到INTERVALL-1=[x1…..y1] 和INTERVALL-2:=[x2…..y2] 所有这些都是简单的实值定义区间。是否有Delphi语法中的内置函数或一些免费的东西,我自己不需要特殊编码就可以获得共享范围 我想避免的是: procedure Findintervall ( ...........) begin if x1 < x2 then if .... if .... if end; 程序Findinterva

我必须找到
INTERVALL-1=[x1…..y1]
INTERVALL-2:=[x2…..y2]

所有这些都是简单的实值定义区间。是否有Delphi语法中的内置函数或一些免费的东西,我自己不需要特殊编码就可以获得共享范围

我想避免的是:

 procedure Findintervall ( ...........)
 begin
 if x1 < x2 then  
   if ....
      if .... 
         if 

 end;
程序Findintervall(…………)
开始
如果x1

我猜这可能是代码,但5个月后很难阅读。

没有内置内容,但编写函数并不困难。您可以使用显式的
if
语句编写它。或者您可以使用
Math
单元中的
Min
Max
。像这样:

type
  TInterval = record
  public
    Left: Double;
    Right: Double;
  public
    class function New(const Left, Right: Double): TInterval; static;
    class function Intersection(const A, B: TInterval): TInterval; static;
  end;

const
  NullInterval: TInterval = (Left: NaN; Right: NaN);

class function TInterval.New(const Left, Right: Double): TInterval;
begin
  Result.Left := Left;
  Result.Right := Right;
end;

class function TInterval.Intersection(const A, B: TInterval): TInterval;
begin
  Assert(A.Left<=A.Right);
  Assert(B.Left<=B.Right);
  Result.Left := Max(A.Left, B.Left);
  Result.Right := Min(A.Right, B.Right);
  if Result.Left > Result.Right then
    Result := NullInterval;
end;
类型
TInterval=记录
公众的
左:双倍;
右:双倍;
公众的
类函数新建(常数左,右:双):TInterval;静止的
类函数相交(常数A,B:TInterval):TInterval;静止的
结束;
常数
NullInterval:TInterval=(左:NaN;右:NaN);
类函数TInterval.New(const Left,Right:Double):TInterval;
开始
结果左:=左;
结果。右:=右;
结束;
类函数TInterval.Intersection(常数A,B:TInterval):TInterval;
开始

Assert(A.Left没有内置函数,但编写函数并不困难。您可以使用显式的
if
语句编写函数。或者您可以使用
Min
Max
数学
单元开始。如下所示:

type
  TInterval = record
  public
    Left: Double;
    Right: Double;
  public
    class function New(const Left, Right: Double): TInterval; static;
    class function Intersection(const A, B: TInterval): TInterval; static;
  end;

const
  NullInterval: TInterval = (Left: NaN; Right: NaN);

class function TInterval.New(const Left, Right: Double): TInterval;
begin
  Result.Left := Left;
  Result.Right := Right;
end;

class function TInterval.Intersection(const A, B: TInterval): TInterval;
begin
  Assert(A.Left<=A.Right);
  Assert(B.Left<=B.Right);
  Result.Left := Max(A.Left, B.Left);
  Result.Right := Min(A.Right, B.Right);
  if Result.Left > Result.Right then
    Result := NullInterval;
end;
类型
TInterval=记录
公众的
左:双倍;
右:双倍;
公众的
类函数New(const Left,Right:Double):TInterval;static;
类函数交集(常数A,B:TInterval):TInterval;静态;
结束;
常数
NullInterval:TInterval=(左:NaN;右:NaN);
类函数TInterval.New(const Left,Right:Double):TInterval;
开始
结果左:=左;
结果。右:=右;
结束;
类函数TInterval.Intersection(常数A,B:TInterval):TInterval;
开始


Assert(如果使用
Min()
Max(),则为A.left)
函数你应该能够摆脱大部分的
if
函数,得到可读性很好的代码。如果你的间隔可以合理地基于集合类型,你可以使用集合运算来找到交点。@Craigyong集合不是存储间隔的正确方法。你确实需要只存储两个端点,而不是ev“这两个值之间存在任何差异”。@DavidHeffernan同意,这就是为什么我只是作为一个评论发布。我确实说明了条件,如果它可以合理地基于一个集合。我当然不知道OPs间隔的细节。我只是提醒大家注意一个可能没有考虑的功能。@DavidHeffernan作为一个例子,如果OP希望处理所有的值。”在两个
字节
间隔的交叉处,以下内容非常优雅:
对于[LStart1..LEnd1]*[LStart2..LEnd2]中的LIntersect,使用
Min()
Max()
函数你应该能够摆脱大部分的
if
函数,得到可读性很好的代码。如果你的间隔可以合理地基于集合类型,你可以使用集合运算来找到交点。@Craigyong集合不是存储间隔的正确方法。你确实需要只存储两个端点,而不是ev“这两个值之间存在任何差异”。@DavidHeffernan同意,这就是为什么我只是作为一个评论发布。我确实说明了条件,如果它可以合理地基于一个集合。我当然不知道OPs间隔的细节。我只是提醒大家注意一个可能没有考虑的功能。@DavidHeffernan作为一个例子,如果OP希望处理所有的值。”s在两个
字节
间隔的交叉处,以下内容非常优雅:
对于[LStart1..LEnd1]*[LStart2..LEnd2]中的LIntersect做
。函数的内容是什么:class function New(const Left,Right:Double):TInterval;static;@user1769184它只是一个简单的助手。现在addedNew之后,TInterval实例的值总是0,如果新代码是这样的话。left:=left?……不。代码很好。你调用它是错误的。我想。你没有显示如何调用它。请再次查看声明。它是一个返回
t的函数Interval
。不要像我怀疑的那样将其作为实例方法调用。这样做:
Interval:=TInterval.New(左,右);
好的,我用错误的方法调用了aInterval.New(左,右);感谢您的建议函数的内容是什么:class function New(const left,right:Double):TInterval;static;@user1769184它只是一个简单的助手。现在addedNew之后,TInterval实例的值总是0,如果新代码是这样的话。left:=left?……不。代码很好。你调用它是错误的。我想。你没有显示如何调用它。请再次查看声明。它是一个返回
t的函数Interval
。不要像我怀疑的那样将其作为实例方法调用。这样做:
Interval:=TInterval.New(左,右);
好的,我用错误的方法调用了aInterval.New(左,右);谢谢你的建议