有没有什么方法可以将TArray <string>转换为TStringDynArray?</string>

时间:2014-02-27 08:41:46

标签: arrays delphi generics dynamic collections

我的代码中有很大一部分(delphi-dutil等)使用TStringDynArray。现在,我想将TDictionary<string, string>的所有密钥转换为TStringDynArray。很遗憾,我只找到TDictionary.Keys.ToArray,即TArray<T>

我知道我可以编写一个简单的复制函数来执行原始内容复制,但我的TStringDynArray通常非常大(大约10000个条目),所以我正在寻找一种有效的方式来转换{{1} } TArray<string>

TStringDynArray

1 个答案:

答案 0 :(得分:12)

最佳解决方案是将代码库中的所有动态数组转换为TArray<T>。这是最好的,因为泛型类型的类型兼容性规则要严格得多。因此,我建议您考虑在代码库中执行此步骤。

但是,这仅适用于您控制的代码。在与无法修改的代码和库进行交互时,您遇到了问题。

在所有这些的根源上,所有这些类型都是动态数组并共享一个通用的实现。这意味着阻塞是在语言级别而不是实现。因此,可以安全地使用强制转换,以使编译器接受您的分配。

var
  DynArr: TStringDynArray;
  GenericArr: TArray<string>;
....
DynArr := TStringDynArray(GenericArr);
GenericArr := TArray<string>(DynArr);

您可以在函数调用参数中使用这些强制转换。

因为您要抑制类型检查,所以您真的不希望在代码中分散这些强制转换。将它们集中到辅助函数中。例如:

function StringDynArray(const arr: TArray<string>): TStringDynArray;
begin
  Result := TStringDynArray(arr);
end;

最后一条评论:这个相关问题可能会引起关注:Is it safe to type-cast TArray<X> to array of X?