簡體   English   中英

任何轉換TArray的有效方法 <string> 到TStringDynArray?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM