与操作员比较记录 [英] Comparing records with operators

查看:63
本文介绍了与操作员比较记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一条记录,该记录将版本号的方案封装在一个整数数组中,并且可以作为字符串互换...

I've created a record which encapsulates scenarios of version numbers in an integer array and is interchangeable as a string...

type
  TVersion = record
    Values: array of Integer;
    function Count: Integer;
    class operator implicit(aVersion: TVersion): String;
    class operator implicit(aVersion: String): TVersion;
  end;

class operator TVersion.implicit(aVersion: TVersion): String;
var
  X: Integer;
begin
  Result:= '';
  for X := 0 to Length(aVersion.Values)-1 do begin
    if X > 0 then Result:= Result + '.';
    Result:= Result + IntToStr(aVersion.Values[X]);
  end;
end;

class operator TVersion.implicit(aVersion: String): TVersion;
var
  S, T: String;
  I: Integer;
begin
  S:= aVersion + '.';
  SetLength(Result.Values, 0);
  while Length(S) > 0 do begin
    I:= Pos('.', S);
    T:= Copy(S, 1, I-1);
    Delete(S, 1, I);
    SetLength(Result.Values, Length(Result.Values)+1);
    Result.Values[Length(Result.Values)-1]:= StrToIntDef(T, 0);
  end;
end;

function TVersion.Count: Integer;
begin
  Result:= Length(Values);
end;

用法:

var
  V: TVersion;
begin
  V:= '1.2.3.4';
  V.Values[3]:= 400;
  ShowMessage(V);
  SetLength(V.Values, 2);
  V.Values[0]:= 7;
  V.Values[1]:= 0;
  ShowMessage(V);
end;

我想做的是能够使用标准运算符比较这些版本,例如...

What I would like to do is be able to compare these versions using standard operators, for example...

if V1 > V2 then ShowMessage('Version 1 is newer than version 2')
else if V1 < V2 then ShowMessage('Version 1 is older than version 2')
else if V1 = V2 then SHowMessage('Version 1 and version 2 are the same');

如果可能的话,我该怎么办?

How can I do this, if possible?

推荐答案

您必须实现一些比较运算符,例如LessThan('<'),Equal等.可重载运算符的完整列表

You have to implement some comparison operators like LessThan ('<'), Equal etc. Full list of overloadable operators is here.

平等实施的简单示例(没有1.2.0 = 1.2的情况)

Simple example of Equal implementation (without cases like 1.2.0 = 1.2)

class operator TVersion.Equal(a, b: TVersion): Boolean;
var
  la, lb: Integer;
begin
  la := Length(a.Values);
  lb := Length(b.Values);
  if la <> lb then
    Result := False
  else if la = 0 then
    Result := True
  else
    Result := CompareMem(a.Values, b.Values, la * SizeOf(Integer));
end;

关于比较两个不同大小的数组(未经测试):

About comparing two arrays of various sizes (not tested):

class operator TVersion.LessThan(a, b: TVersion): Boolean;
var
  la, lb, i: Integer;
begin
  la := Length(a.Values);
  lb := Length(b.Values);
  for i := 0 to Min(la, lb) - 1 do
    if a.Values[i] < b.Values[i] then   // 1.2.xxx < 1.3.xxx
      Exit(True)
    else if a.Values[i] > b.Values[i] then //1.3.xxx > 1.2.xxx
      Exit(False);

  //common parts are equal, check a rest
  //cases 1.2.3.xxx vs 1.2.3 or 1.2.3.xxx vs 1.2.3
  //and empty cases too
  Result := la < lb;
end;

这篇关于与操作员比较记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆