数组 – 将TArray转换为TStringDynArray的任何有效方法?
发布时间:2020-12-15 09:40:53 所属栏目:大数据 来源:网络整理
导读:我的代码中很大一部分( delphi-dutil等)使用TStringDynArray.现在我想将所有键转换为TDictionary string,string到TStringDynArray.不幸的是我只找到了TDictionary.Keys.ToArray,它是TArray T. 我知道我可以编写一个简单的复制函数来执行原始内容复制,但我的T
我的代码中很大一部分(
delphi-dutil等)使用TStringDynArray.现在我想将所有键转换为TDictionary< string,string>到TStringDynArray.不幸的是我只找到了TDictionary.Keys.ToArray,它是TArray< T>.
我知道我可以编写一个简单的复制函数来执行原始内容复制,但我的TStringDynArray通常非常大(大约10000个条目),所以我正在寻找一种有效的方法来转换TArray< string>到TStringDynArray. function ConvertToStringDynArray(const A: TArray<string>): TStringDynArray; var I: Integer; begin assert(A <> nil); SetLength(Result,Length(A)); for I := 0 to Length(A) - 1 do Result[I] := A[I]; end; 解决方法
最佳解决方案是将代码库中的所有动态数组转换为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? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |