Delphi 向泛型TArray类添加非类函数

Delphi 向泛型TArray类添加非类函数,delphi,delphi-xe7,generic-collections,Delphi,Delphi Xe7,Generic Collections,在System.Generics.Collections中,TArray类型仅具有类函数 例如: class procedure Sort<T>(var Values: array of T); overload; static; 类过程排序(var值:T的数组);超载;静止的 这意味着唯一可接受的语法如下: var Arr : TArray<integer>; begin SetLength(Arr, 2); Arr[0] := 5; Arr[1]

System.Generics.Collections
中,
TArray
类型仅具有类函数

例如:

class procedure Sort<T>(var Values: array of T); overload; static;
类过程排序(var值:T的数组);超载;静止的
这意味着唯一可接受的语法如下:

var
  Arr : TArray<integer>;
begin
  SetLength(Arr, 2);
  Arr[0] := 5;
  Arr[1] := 3;

  TArray.Sort<integer>(Arr);
end;
var
Arr:TArray;
开始
设定长度(Arr,2);
Arr[0]:=5;
Arr[1]:=3;
TArray.Sort(Arr);
结束;
我想定义一个对象的函数,以便使用以下语法对通用数组的值进行排序:

var
  Arr : TArray<integer>;
begin
  SetLength(Arr, 2);
  Arr[0] := 5;
  Arr[1] := 3;

  Arr.Sort();
end;
var
Arr:TArray;
开始
设定长度(Arr,2);
Arr[0]:=5;
Arr[1]:=3;
Arr.Sort();
结束;

您可以为非通用动态数组或完全专用的通用动态数组定义帮助程序。例如,您可以编写:

type
  TMyArray1 = array of Integer;
  TMyArray2 = TArray<Integer>;

  TMyArrayHelper1 = record helper for TMyArray1
  end;
  TMyArrayHelper2 = record helper for TMyArray2
  end;
  TMyArrayHelper3 = record helper for TArray<Integer>
  end;
类型
TMyArray1=整数数组;
tMyarray 2=焦油;
TMyArrayHelper1=TMyArray1的记录辅助程序
结束;
TMyArrayHelper2=TMyArray2的记录辅助程序
结束;
TMyArrayHelper3=TArray的记录辅助程序
结束;
这允许您将方法添加到此类数组的作用域中

这样你就可以写作了

type
  TIntegerArrayHelper = record helper for TArray<Integer>
    procedure Sort;
  end;

procedure TIntegerArrayHelper.Sort;
begin
  TArray.Sort<Integer>(Self);
end;
类型
TinteGrarrayHelper=TArray的记录辅助对象
程序分类;
结束;
程序tintegerarayhelper.Sort;
开始
TArray.Sort(Self);
结束;
但是,您不能写:

  TMyArrayHelper<T> = record helper for TArray<T>
  end;
TMyArrayHelper=记录TArray的助手
结束;
编译器根本不支持泛型帮助程序

在我看来,这些都不值得,只要打电话:

TArray.Sort<T>()
TArray.Sort()

直接的。在我看来,添加一个记录帮助器,并且必须为您希望支持的每个元素类型创建一个记录帮助器,这似乎是一种成本,无法证明返回的合理性。

您可以为非通用动态数组或完全专用的通用动态数组定义帮助器。例如,您可以编写:

type
  TMyArray1 = array of Integer;
  TMyArray2 = TArray<Integer>;

  TMyArrayHelper1 = record helper for TMyArray1
  end;
  TMyArrayHelper2 = record helper for TMyArray2
  end;
  TMyArrayHelper3 = record helper for TArray<Integer>
  end;
类型
TMyArray1=整数数组;
tMyarray 2=焦油;
TMyArrayHelper1=TMyArray1的记录辅助程序
结束;
TMyArrayHelper2=TMyArray2的记录辅助程序
结束;
TMyArrayHelper3=TArray的记录辅助程序
结束;
这允许您将方法添加到此类数组的作用域中

这样你就可以写作了

type
  TIntegerArrayHelper = record helper for TArray<Integer>
    procedure Sort;
  end;

procedure TIntegerArrayHelper.Sort;
begin
  TArray.Sort<Integer>(Self);
end;
类型
TinteGrarrayHelper=TArray的记录辅助对象
程序分类;
结束;
程序tintegerarayhelper.Sort;
开始
TArray.Sort(Self);
结束;
但是,您不能写:

  TMyArrayHelper<T> = record helper for TArray<T>
  end;
TMyArrayHelper=记录TArray的助手
结束;
编译器根本不支持泛型帮助程序

在我看来,这些都不值得,只要打电话:

TArray.Sort<T>()
TArray.Sort()

直接的。在我看来,添加一个记录助手,并且必须为您希望支持的每种元素类型创建一个记录助手,这似乎是一种成本,不能证明返回是合理的。

单位
System
中的类型
TArray
System.Generics.Collections
中的
TArray
类不同。使用记录助手怎么样?更多信息,请参见您自己的details@DelphiCoder:这是一个不同的问题,我想使用泛型arrays@Fabrizio这一点在问题中根本不清楚,是吗
TArray.Sort()
不要求传递泛型数组。@DavidHeffernan:同意,这很容易被误解。。。我已经更新了一段时间的公开请求问题:Unit
System
中的类型
TArray
System.Generics.Collections中的
TArray
类不同。使用记录助手怎么样?更多信息,请参见您自己的details@DelphiCoder:这是一个不同的问题,我想使用泛型arrays@Fabrizio这一点在问题中根本不清楚,是吗
TArray.Sort()
不要求传递泛型数组。@DavidHeffernan:同意,这很容易被误解。。。我已经更新了一段时间的公开请求问题: