tarray<string>和array of string完全一样,两个类型的变量可以直接互相赋值也可以直接写在参数里 tstringlist与tarray<string>的相互转换 c := tstringlist.create; c.addstrings(a); //copy a to c a := c.tostringarray; //copy c to a
tlist<string>与Tarray<string>的相互转换 d := TList<string>.Create(a); //copy a to d a := d.ToArray; //copy d to a
tlist<string>与TStringList的相互转换 d := TList<string>.Create(c); //copy c to d c := TStringList.Create; c.AddStrings(d.ToArray); //copy d to c
----------------------------------------------
-
tarray<string>和array of string用法一样,但不能copy,也不能直接互相赋值,参数也不能相互替代。 var TS:TArray<string>; Arr:array of string; begin for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100); Move(TS[0],Arr[0],Length(TS)*4); for var i := 0 to 99 do Memo1.Lines.Add(Arr[i]); end;
----------------------------------------------
-
Move在知道String数组长度的时候可用,string数组是不定长的,因此用起来也不方便。 用泛型copy是比较好的解决方案: uses System.Generics.Collections; var TS:TArray<string>; Arr:array of string; begin for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100); TArray.Copy<String>(TS,Arr,100); end;
----------------------------------------------
-
@hs_kill 谢谢 我是11.2试了一下 函数形参是array of string的时候传入array of string或者tarray<string>都可以 函数形参是tarray<string>的时候传入array of string不行 如果定义了2个变量 分别是array of string 如果都在函数内部定义是可以互相赋值的 如果一个是形参一个是实参就会提示'不兼容的类型,Dynmic array和array of string'
B := A; 这里仅仅是把 A 的指针给了 B,原来的那个字符串只是多了一个引用。没有另外分配空间,复制字符串。
但是,如果是:
A := 'abcd'; B := A; A := '1234'; 《--- 到这里,因为 A 的内容被改了,但 B 仍然是以前的内容 abcd,因此,这里新分配了空间。分配空间比较消耗 CPU。
关于分配空间比较消耗 CPU 这个事情,不管是 Delphi 还是 C,都有一个技巧,就是预先分配一个比较大的空间。比如以下代码:
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin List.Capacity := 100; //如果没有这行代码,那么,每次 add 可能都要重新分配空间。这行代码就预先分配足够空间。 List := TStringList.Create; for i := 0 to 99 do begin List.Add(i.ToString); end; end;
再说 TArray<string>,看看 Delphi 自己的代码: function TStrings.ToStringArray: TArray<string>; var I: Integer; begin SetLength(Result, Count); for I := 0 to Count - 1 do Result[I] := Strings[I]; end;
for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100);
对于这段代码, 如果不想用list, 可以这样写 setlength(TS, 100) for var i := 0 to 99 do TS[i]:= i.ToString; 这样只有最开始分配了一次内存, 后面都是指针引用
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
"TArray<string>" It's not compatible with "Array of String"
---> sTA := sAS --> does not works ---> sAS := sTA --> does not works
why: Because the "Delphi" use:
1) first: the "type's name" to compatibility; 2) later, the "data's type" !!!
then...
1) we needs a "CAST" between objects/vars
type TdinArrStr1 = TArray<string>; TdinArrStr2 = array of string; ....
sAS := TdinArrStr2(sTA); // sTA := TdinArrStr1(sAS); // sLS.AddRange(sTA); sLS.AddRange(sAS); sLS.AddRange(sTS.ToStringArray); // sTS.AddStrings(sTA); sTS.AddStrings(sAS); sTS.AddStrings(sLS.ToArray); // sTA := sLS.ToArray; sTA := sTS.ToStringArray; sAS := TdinArrStr2(sLS.ToArray); sAS := TdinArrStr2(sTS.ToStringArray);
NOTE: NO NEED ANY WORKAROUND TO RE-ALLOCATION OF MEMORY, like Setlenght() function
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
you can many others methods to get it, for example
1) a "string" has many helper functions like "SPLIT" and "JOIN" 2) all "STRINGLIST" has a "TEXT" property ( TStringList, TList, etc...)
ex.:
var xxx : string; .... var zzz: TArray<string>;
xxx := TS.TEXT; zzz := xxx.SPLIT( .... ) xxx := ''.JOIN(....);
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3