[英]Any efficient way to convert TArray<string> to TStringDynArray?
我的代碼中很大一部分( 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;
最后一條評論:這個相關問題可能很有意義: 將TArray <X>輸入到X數組是否安全?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.