sta*_*005 5 arrays delphi generics collections dynamic
相当大一部分代码(delphi-dutil等)使用TStringDynArray.现在我想将所有键a转换TDictionary<string, string>为a 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;
Run Code Online (Sandbox Code Playgroud)
Dav*_*nan 13
最好的解决方案是将代码库中的所有动态数组转换为TArray<T>.这是最好的,因为泛型类型具有更不严格的类型兼容性规则.因此,我建议您考虑在代码库中执行此步骤.
但是,这仅适用于您控制的代码.在与无法修改的代码和库进行交互时,您遇到了问题.
在所有这些的根源,所有这些类型都是动态数组并共享一个通用的实现.这意味着阻塞是在语言级别而不是实现.因此,可以安全地使用强制转换,以使编译器接受您的分配.
var
DynArr: TStringDynArray;
GenericArr: TArray<string>;
....
DynArr := TStringDynArray(GenericArr);
GenericArr := TArray<string>(DynArr);
Run Code Online (Sandbox Code Playgroud)
您可以在函数调用参数中使用这些强制转换.
因为您要抑制类型检查,所以您真的不希望在代码中分散这些强制转换.将它们集中到辅助函数中.例如:
function StringDynArray(const arr: TArray<string>): TStringDynArray;
begin
Result := TStringDynArray(arr);
end;
Run Code Online (Sandbox Code Playgroud)
最后一条评论:这个相关的问题可能很有意义:将TArray <X>打包到X数组是否安全?
| 归档时间: |
|
| 查看次数: |
2126 次 |
| 最近记录: |