将通用阵列打印到控制台

时间:2014-07-12 16:13:37

标签: delphi delphi-xe6

如何将通用阵列打印到控制台?这适用于简单的整数数组,但不适用于通用数组。

class procedure Print(const A: TArray<Integer>; const Name: String);
var
  I: Integer;
begin
  Write('Array ' + Name +' : ');
  Write('[');
  for I := 0 to High(A) do
  if I <> High(A) then
  begin
    WriteLn(A[I]);
    Write(', ');
  end
  else
  Write(A[I]);
  Write(']');
  WriteLn('');
end;

1 个答案:

答案 0 :(得分:6)

无法使用泛型参数调用WriteWriteln过程。因此,显而易见的结论是,在调用WriteWriteln之前,您需要将泛型值转换为字符串。

这可以通过利用以下功能使用TValue来实现:

  1. 制作新TValue.From<T>实例的通用TValue方法。
  2. 将大多数常见类型转换为字符串的TValue.ToString方法。
  3. 所以,我认为你正在寻找这样的东西:

    {$APPTYPE CONSOLE}
    
    uses
      System.Rtti;
    
    type
      TMyClass = class
        class procedure Write<T>(const arr: array of T; const Name: string); static;
      end;
    
    class procedure TMyClass.Write<T>(
      const arr: array of T; const Name: string);
    var
      I: Integer;
    begin
      System.Write('Array ' + Name +' : [');
      for I := 0 to high(arr) do begin
        System.Write(TValue.From(arr[i]).ToString);
        if I <> high(arr) then begin
          System.Write(', ');
        end;
      end;
      System.Writeln(']');
    end;
    
    begin
      TMyClass.Write<Integer>([1,2,3,4], 'integer');
      TMyClass.Write<Double>([42.666, 123.4], 'floating point');
      TMyClass.Write<string>(['foo', 'bar'], 'string');
      Readln;
    end.
    

    <强>输出

    Array integer : [1, 2, 3, 4]
    Array floating point : [42.666, 123.4]
    Array string : [foo, bar]
    

    顺便说一句,我必须创建一个类来保存这些方法。我不明白为什么语言设计师会做出这个决定。