Arrays 如何重构在阵列之间复制/移动数据?

Arrays 如何重构在阵列之间复制/移动数据?,arrays,delphi,delphi-xe7,Arrays,Delphi,Delphi Xe7,我有一个进程,将数据读入150多个临时数组,处理数据并将数据从临时数组复制到工作数组。工作阵列位于一个全局阵列中,因此我可以导入多个数据,这意味着我可以重复相同的过程多达100次,最终在一个大阵列上创建一组工作阵列,其中包含100倍的工作数据,我可以处理、比较和处理这些数据 我有150多个阵列,因此有150次: // for each array SetLength(myData[Idx].WorkNames,Length(tmpNames)); // <- prepare

我有一个进程,将数据读入150多个临时数组,处理数据并将数据从临时数组复制到工作数组。工作阵列位于一个全局阵列中,因此我可以导入多个数据,这意味着我可以重复相同的过程多达100次,最终在一个大阵列上创建一组工作阵列,其中包含100倍的工作数据,我可以处理、比较和处理这些数据

我有150多个阵列,因此有150次:

    // for each array
    SetLength(myData[Idx].WorkNames,Length(tmpNames)); // <- prepare to copy
    for i := 0 to High(tmpNames) do  // <- copy
      myData[Idx].WorkNames[i]:=tmpNames[i];
    SetLength(tmpNames,0);  //  <- clear tmp array
//对于每个数组

SetLength(myData[Idx]。工作名,长度(tmpNames));// 如果您真的想复制,那么就使用泛型。您可以从
System.Generics.Collections
中声明的静态类方法的
TArray
类派生。例如:

type
  TArray = class(Generics.Collections.TArray)
  public
    class function Copy<T>(const Source: array of T; Index, Count: Integer): TArray<T>; overload; static;
    class function Copy<T>(const Source: array of T): TArray<T>; overload; static;
  end;

....

class function TArray.Copy<T>(const Source: array of T; Index, Count: Integer): TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Count);
  for i := 0 to high(Result) do begin
    Result[i] := Source[i+Index];
  end;
end;

class function TArray.Copy<T>(const Source: array of T): TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Length(Source));
  for i := 0 to high(Result) do begin
    Result[i] := Source[i];
  end;
end;
与:

如果您准备让
tmpNames
简单地离开范围,那么您可以使用一行:

myData[Idx].WorkNames := tmpNames;
尽管如此,如果将
tmpNames
重新用于不同的数组,则需要
nil
赋值

再一次,从问题中的代码可以看出,您根本不需要临时数组。为什么不直接对长寿命的数据结构进行操作呢

仅当赋值的源和目标与赋值兼容时,才允许使用这些数组赋值。您的类型不是因为您使用了不同的类型。切换到
TArray
以避免这种情况。有关更多信息,请参见此问题:


请记住,动态数组是引用类型。在这里显示的用法中,您只需复制引用即可。您只需要实际数组的一个实例。因此根本不需要复制。

此行
AllWorkData[0]。工作名称:=tmpNames显示:
[dcc32错误]Unit1.pas(90):E2008不兼容类型
。我做错了什么?这是因为。
WorkNames
tmpNames
是不兼容赋值的不同类型。改为使用
TArray
,用合适的类型替换
T
。啊哈,现在它可以工作了。因此,您建议将T的所有
数组替换为
TArray
…是的。这绝对是一个好的举动。它将允许更大的灵活性和可组合性。@MikeTorrettinni否。发出的代码是相同的。它们仍然是动态数组。没有任何事件。
SetLength(myData[Idx].WorkNames,Length(tmpNames)); // <- prepare to copy
for i := 0 to High(tmpNames) do  // <- copy
  myData[Idx].WorkNames[i]:=tmpNames[i];
SetLength(tmpNames,0);  //  <- clear tmp array
myData[Idx].WorkNames := tmpNames;
tmpNames := nil;
myData[Idx].WorkNames := tmpNames;