如何使用Generic方法和<T>数组的参数数组?

Mik*_*nni 2 delphi generics delphi-10.1-berlin

很多时候,当使用通用数组时,我需要知道我正在使用的数组的最大长度.很长一段时间我一直在使用:

MaxIntValue([Length(Array1), Length(Array2) , Length(Array3)]); // from Math unit
Run Code Online (Sandbox Code Playgroud)

然后我用我的方法简化了这个(跳过输入Length()):

// array of array of TCardBrand
function GetMaxLength(const aArrays: array of TArrayOfCarBrand): integer;
Run Code Online (Sandbox Code Playgroud)

效果很好,但现在我想创建一个通用的MaxLength,我无法使其工作

class function MaxLength<T>(aArrays: array of array of T): integer; - it gives error: [dcc32 Error] Unit2.pas(31): E2029 Identifier expected but 'ARRAY' found
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的代码,使用Math单元中的MaxIntValue和我的方法示例的工作示例,但扩展通用TArray不起作用:

TCarBrand = record
    BrandID: integer;
    BrandName: string;
    BrandCountry: string;
  end;

  TArrayOfCarBrand = array of TCarBrand;

  TArray = class(System.Generics.Collections.TArray)
  public          
      // ERROR:  E2029 Identifier expected but 'ARRAY' found
       class function MaxLength<T>(aArrays: array of array of T): integer;
  end;

var  
  vCarsUS, vCarsEU, vCarsJP: TArrayOfCarBrand;

implementation

{$R *.dfm}


class function TArray.MaxLength<T>(aArrays: array of array of T): integer;
var
  i: Integer;
begin
  Result := 0;
  for i := Low(aArrays) to High(aArrays) do
    Result := MaxIntValue([Result, Length(aArrays[i])]);
end;


function GetMaxLength(const aArrays: array of TArrayOfCarBrand): integer;
var
  i: Integer;
begin
  Result := 0;
  for i := Low(aArrays) to High(aArrays) do
    Result := MaxIntValue([Result, Length(aArrays[i])]);
end;


procedure TForm2.Button1Click(Sender: TObject);
var vMaxLength: integer;
begin
  // test lengths
  SetLength(vCarsUS,1);
  SetLength(vCarsEU,10);
  SetLength(vCarsJP,100);

  // using MaxIntValue from Math unit - works OK
  vMaxLength := MaxIntValue([Length(vCarsUS), Length(vCarsEU), Length(vCarsJP)]);

  // using my method GetMaxLength - works OK
  vMaxLength := GetMaxLength([vCarsUS, vCarsEU, vCarsJP]);

  // trying to set Generic TArray.MaxLength - ERROR
  vMaxLength := TArray.MaxLength<TCarBrand>([vCarsUS, vCarsEU, vCarsJP]);
end;
Run Code Online (Sandbox Code Playgroud)

如何扩展泛型MaxValue以接受<T>数组的开放数组?

Dav*_*nan 8

这很简单.您的函数不接受通用数组,因为参数列表不会尝试这样做.像这样改变它.

class function MaxLength<T>(const aArrays: array of TArray<T>): Integer;
Run Code Online (Sandbox Code Playgroud)

这里的关键是TArray<T>专门使用.这是通用动态数组类型,使用它可以提供比array of动态数组类型更灵活的类型兼容性.这里详细介绍了这些问题:使用TArray而不是Array of T的原因是什么?

这样做的结果是您需要替换所有动态类型声明并使用TArray<T>.实际上,您根本不需要声明任何动态数组类型.您可以删除此表单的所有声明:

type
  TFooArray = array of TFoo;
Run Code Online (Sandbox Code Playgroud)

然后替换所有出现的TFooArrayTArray<TFoo>.另一个好处是您不需要声明任何数组类型,并且您的代码变得不那么冗长.

我还会评论说,MaxIntValue当你只有两个参数时,使用它没什么意义.Max然后使用该功能.