DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 2
在线用户: 1
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 17:35:41
标题:
FMX里有现成的把数组元素顺序颠倒的方法吗 浏览:2265
加入我的收藏
楼主: 相当于tlist<integer>的reverse方法
array of integer 或 tarray<integer>有类似现成的方法吗,还是只能自己写一个呢?
如果数组先转换成tlist<integer>应该如何转换呢?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/4/18 17:46:26
1楼: 其实对于 array 来说,有必要颠倒顺序吗?

如果你要颠倒顺序访问,for 循环从大到小就行了。

通常:

for i := 0 to Length(YourArray) -1 do

变成:

for i := Length(YourArray) -1 downto 0 do
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2023/4/18 17:49:24
2楼: 您的问题和 fmx vcl 无关,属于 rtl 范凑。
找 EMB 算账的时候,记得选 rtl 。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 18:18:41
3楼: @pcplayer 有时还是需要用一下的,比如这样
for var i: Integer := 0 to High(lbs1) do
begin
  lbs1[i].Text := ida1[i + 1].ToString;
.....
end;
如果用donwnto的话就要改i+1比较麻烦,不然次序就颠倒了.
@wang_80919 好的 明白了
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 18:38:20
4楼: 这些,简单的问题,自己去练一下就可以了
----------------------------------------------
-
作者:
男 qiuqiu77 (球球) ▲▲▲▲▲ -
普通会员
2023/4/18 18:56:47
5楼:     for var i := Low(Value) to High(Value) div 2 do
    begin
      var tmp := Value[i];
      Value[i] := Value[High(Value) - i];
      Value[High(Value) - i] := tmp;
    end;
----------------------------------------------
-
作者:
男 qiuqiu77 (球球) ▲▲▲▲▲ -
普通会员
2023/4/18 19:00:07
6楼: 出处:
https://www.delphipraxis.net/171924-how-reverse-array-any-type.html

type
  TArrayUtil = class
  strict private
    class procedure Swap<T>(var A, B: T); static; inline;
  public
    class procedure Reverse<T>(var Value: TArray<T>); overload; static;
    class procedure Reverse<T>(var Value: Array of T); overload; static;
  end;

{ TArrayUtil }

class procedure TArrayUtil.Reverse<T>(var Value: TArray<T>);
begin
  if Length(Value) > 0 then
    for var i := Low(Value) to High(Value) div 2 do
      Swap<T>(Value[i], Value[High(Value) - i]);
end;

class procedure TArrayUtil.Reverse<T>(var Value: Array of T);
begin
  if Length(Value) > 0 then
    for var i := Low(Value) to High(Value) div 2 do
      Swap<T>(Value[i], Value[High(Value) - i]);
end;

class procedure TArrayUtil.Swap<T>(var A, B: T);
begin
  var C: T := A;
  A := B;
  B := C;
end;
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 19:02:58
6楼: @ hq200306 @qiuqiu77 谢谢 假如我要写个这个转换的函数


function 返回数组倒置(Value: tarray<integer >): tarray<integer>;
var
  temp:integer;
begin
  for var i := Low(Value) to High(Value) div 2 do
    begin
      var tmp := Value[i];
      Value[i] := Value[High(Value) - i];
      Value[High(Value) - i] := tmp;
    end;
  Result := Value;
end;

假如这个value也可能是字符串数组,控件的数组,必须再写两个函数重载吗,有办法写成通用的吗?
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 19:06:28
7楼: @qiuqiu77 哈哈这个好 非常感谢
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 19:17:21
8楼: 如果从运行效率来说,6楼代码,
1、把函数改成过程
2、人口参数,改为变参
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/4/18 19:29:42
9楼: 要想通用,就用泛型。泛型的意思,就是通用。

假设 TList<> 有某个功能,那么, TList<Integer> 和 TList<TLabel> 都有同样的功能。也就是该功能通用了。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 19:40:11
10楼: delphi 的泛型做得不好,每增加个泛型编译后程序增加10k左右,emb怎么不去优化一下
----------------------------------------------
-
作者:
男 1111111113 (1111111113) ▲△△△△ -
普通会员
2023/4/18 20:25:00
11楼: Delphi 过程与函数
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 20:26:10
12楼: @ hq200306 人口参数,改为变参就是把value的类型改成T吗 
  Swap和Reverse这两个过程前面为什么要带个class呢?后面加个inline会提高效率吗?后面加个static又是干什么呢?

@ pcplayer 解释的很好,泛就是广泛,确实方便.
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 21:17:51
13楼: 下面两种都可以,变参和引用
//1
procedure fun1(var Value: tarray<integer>);
begin
  for var i := Low(Value) to High(Value) div 2 do
  begin
    var tmp := Value[i];
    Value[i] := Value[High(Value) - i];
    Value[High(Value) - i] := tmp;
  end;
end;
//2
procedure fun2(Value: tarray<integer>);
begin
  for var i := Low(Value) to High(Value) div 2 do
  begin
    var tmp := Value[i];
    Value[i] := Value[High(Value) - i];
    Value[High(Value) - i] := tmp;
  end;
end;
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 21:21:52
14楼: 变参说的就是传地址的意思么
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 21:25:02
15楼: 这些都是基本概念,练一下就可以了
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/18 21:28:15
16楼: @hq200306 好的 非常感谢
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 21:35:45
17楼: 这段代码用变参,符合计算逻辑
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/18 21:45:33
18楼: function ArrIntEndToStart(AValue: TArray<integer>): TArray<integer>;
begin
  for var i: integer := high(AValue) downto 0 do
    result          := result + [AValue[i]];
end;
----------



procedure TForm1.Button1Click(Sender: TObject);
var
  LArrInt: TArray<integer>;
  A, B   : TArray<integer>;
  LText  : string;
begin
  LArrInt := [1, 2, 3, 4, 5]; // [] // ArrIntEndToStart( [11,4,51,57,2 ] );
  //
  A := ArrIntEndToStart(LArrInt);
  B := ArrIntEndToStart(A);
  //



  //  MEMO can needs many time to process, then, it's a just for tests!!!

  LText := '';
  for var V in A do
    LText := LText + ',' + V.ToString;
  //
  Memo1.Text := LText.Remove(0, 1);
  LText      := '';
  //
  for var V in B do
    LText := LText + ',' + V.ToString;
  //
  Memo1.Lines.Add(LText.Remove(0, 1));
end;
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/18 21:59:27
19楼: 上面18楼的代码也行,但计算效率太低了
----------------------------------------------
-
作者:
男 flcop (flcop) ▲▲▲▲△ -
普通会员
2023/4/18 23:58:37
20楼: 实际上只需要数量大于1的情况下做交换:
if Length(Value) > 1 then
  ...
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/4/19 9:54:22
21楼: 总之,我觉得没有重新倒排序的必要。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/4/19 10:10:58
22楼: 有些地方需要用到倒排序,比如图像的水平镜像
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/4/19 12:41:26
23楼: 哎,连个lambda表达式都没有
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/19 13:53:54
24楼: 谢谢大家 @wk_knife 可否示范一下,谢谢.
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/20 3:15:53
25楼: try this way,now:

DONT USE "MEMO" IN CONSIDERATION!!!! <---

----------

procedure TForm1.Button1Click(Sender: TObject);
var
  SW        : TStopWatch;
  arr1, arr2: array of Integer;
  elements  : Integer;
  LText     : string;
begin
  elements := 1_000_000;
  SetLength(arr1, elements);
  SetLength(arr2, elements);
  //
  for var i: Integer := 0 to (elements - 1) do
    arr1[i]          := i;
  //
  Memo1.Text := high(arr1).ToString;
  Memo1.Lines.Add(length(arr1).ToString + ' - ' + length(arr2).ToString);
  //
  SW := TStopWatch.Create;
  SW.Start;
  //
  for var i := 0 to high(arr1) do
    Move(arr1[high(arr1) - i], arr2[i], SizeOf(Integer));
  //
  SW.Stop;
  //
  Caption := 'SW = ' + SW.Elapsed.TotalMilliseconds.ToString;
  //
  Memo1.Lines.Add('Arr1: First: ' + arr1[0].ToString + ' - Last: ' + arr1[elements - 1].ToString);
  Memo1.Lines.Add('Arr2: First: ' + arr2[0].ToString + ' - Last: ' + arr2[elements - 1].ToString);
  //
  SW.StartNew;
  //
  for var i: Integer := 0 to high(arr2) do
    LText          := LText + ',' + arr2[i].ToString;
  //
  SW.Stop;
  //
  Caption := Caption + ' -- SW-2 LText = ' + SW.Elapsed.TotalMilliseconds.ToString;

  // Memo1.Lines.Add(LText.Remove(0, 1));
end;
此帖子包含附件:
PNG 图像
大小:12.0K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/20 3:17:41
26楼: 50,000,000 items integer at 19,18ms
此帖子包含附件:
PNG 图像
大小:5.2K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/20 3:46:08
27楼: procedure TForm1.Button1Click(Sender: TObject);
var
  SW        : TStopWatch;
  arr1, arr2: array of Integer;
  elements  : Integer;
  LText     : string;
begin
   // in 32bits MSWindows:
   // > 200 millions = StackOver Flow error!!!  because will be = 400_000_000 elements  X "type size" on memory!!! = 1.4901161194 GB
  // Delphi use until  1.048576 GB by default  to Stack memory!!!
  //
  // in 64bits MSWindows  .... you go to much much more....
  //
  elements := 200_000_000;
  //
  SetLength(arr1, elements);
  SetLength(arr2, elements);
  //
  for var i: Integer := 0 to (elements - 1) do
    arr1[i]          := i;
  //
  Memo1.Text := high(arr1).ToString;
  Memo1.Lines.Add(length(arr1).ToString + ' - ' + length(arr2).ToString);
  //
  SW := TStopWatch.Create;
  SW.Start;
  //
  for var i := 0 to high(arr1) do
    Move(arr1[high(arr1) - i], arr2[i], SizeOf(Integer));
  //
  SW.Stop;
  //
  Caption := 'SW = ' + SW.Elapsed.TotalMilliseconds.ToString;
  //
  Memo1.Lines.Add('Arr1: First: ' + arr1[0].ToString + ' - Last: ' + arr1[elements - 1].ToString);
  Memo1.Lines.Add('Arr2: First: ' + arr2[0].ToString + ' - Last: ' + arr2[elements - 1].ToString);
  //
  SetLength(arr1, 0);  // <- clean memory because the LText below
  SetLength(arr2, 0);
  arr1 := [];
  arr2 := [];
  //
  SW.StartNew;
  //
  for var i: Integer := 0 to high(arr2) do
    LText          := LText + ',' + arr2[i].ToString;
  //
  SW.Stop;
  //
  Caption := Caption + ' -- SW-2 LText = ' + SW.Elapsed.TotalMilliseconds.ToString;
  //
  // Memo1.Lines.Add(LText.Remove(0, 1));
end;
此帖子包含附件:
PNG 图像
大小:13.0K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/20 4:14:11
28楼: in 64bits MSWindows: last test (1,800,000,000 x 2)  elements

1799999999
1800000000 - 1800000000
Arr1: First: 0 - Last: 1799999999
Arr2: First: 1799999999 - Last: 0

SW = 7774,244ms -- SW-2 LText = 7774,244ms

and go on...
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/21 17:32:29
29楼: @ emailx45 顶,感谢.
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/21 17:37:33
30楼: @qiuqiu77 有个新的问题来了,我想加个找出元素在数组中的序号的函数.
class function TArrayUtil.Getindx<T>(var SourceArr: array of T; Item: T): integer;
var
  id: Integer;
 begin
  id := -1;
  for var i := Low(SourceArr) to High(SourceArr) do
  begin
    if SourceArr[i] = Item then
    begin
      id := i;
      break;
    end;
  end;

  Result := id;
end;
比如找出数组['1','2','3']中的'2',应该返回序号1,但就始终找不到呢,调试的时候i=1的时候监视列表里SourceArr[i] = Item是true,但程序就是不按这个走,怎么回事呢?
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/22 3:57:38
31楼:   c: array of string;
begin
  c := ['1', '2', '3'];
  //
  for var i: integer := 0 to high(c) do
    if c[i] = '2' then
      showmessage( i.ToString ); // 1
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/4/22 12:56:47
32楼: @emailx45 您这样写当然没问题 
我是说6楼的代码TArrayUtil类中加入30楼的函数,可能是泛型的原因,程序在判断相等上出了问题,
 if SourceArr[i] = Item then 这句判断没起作用,虽然确实相等,但就是没有跳到then里面执行,怎么解决这个问题呢?
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/4/24 6:02:36
33楼: @mp654kk


look this
https://bbs.2ccc.com/topic.asp?topicid=675330
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/5/30 13:31:27
34楼: @emailx45 您这个例子是提前知道是integer类型的情况下 我的意思是用泛型事先不知道是什么类型 比如T是string的时候明明两个字符串相等 但用了泛型程序无法识别出相等怎么弄呢
总不能T是integer的时候写一个 是string的时候写一个 ......这样就太麻烦了

所以问题归结为比如两个泛型 一个T1假如是个字符串'abc',另一个泛型T2也是字符串'abc'程序里面我写if T1=T2 then .....程序居然认为是false无法判断是一样的字符串,应该怎么写才能得到正确结果呢?
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/5/31 2:11:13
35楼: @mp654kk

try something like this:

Delphi checks whether the "type" of the object is compatible or not! If the types are compatible then you can do something. Otherwise, you'll need to do a "casting" or nothing!

Thus, you cannot compare the value (initially), but only after evaluating the involved types!

Delphi looks at the "type name", not the definition itself!

type
  TMyTypeArrInteger = array of integer; // always "type name" for your "types"

procedure TForm1.Button1Click(Sender: TObject);
var
  Arr1: TMyTypeArrInteger;
  Arr2: array of integer;
  Arr3: TMyTypeArrInteger;
  Arr4: array of integer;
begin

  // Arr1 := Arr2; // incompatible
  //
  Arr1 := Arr3;  // OK
  //
  Arr2 := Arr4; // incompatible == needs:  "Arr2: TMyTypeX;" and  "Arr4: TMyTypeX"; == "TMyTypex = array of integer";
end;

----------


implementation

{$R *.dfm}

uses
  System.Rtti;

type

  TTest<T1, T2> = class
  public
    class function TheValuesIsEqual_01(ValueA: T1; ValueB: T2): boolean;
  end;

  { TTest<T1, T2> }

class function TTest<T1, T2>.TheValuesIsEqual_01(ValueA: T1; ValueB: T2): boolean;
begin
  //
  // same "type name" =>  string=string, integer=integer, TMyType=TMyType
  //
  // ...Kind => TTypeKind.tk...
  //
  if TValue.From<T1>(ValueA).Kind = TValue.From<T2>(ValueB).Kind then
    begin
      if T1(ValueA) = T2(ValueB) then
        ShowMessage('ValueA = ValueB')
      else
        ShowMessage('ValueA <> ValueB');
    end
  else
    ShowMessage('ValueA type is not the same than ValueB');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TTest<integer, integer>.TheValuesIsEqual_01(123, 123);
end;

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/2 0:17:38
36楼: @emailx45 非常感谢确实对了,但是如果是泛型的数组里的元素跟泛型变量比较又不对了呢

class function TArrayUtil.GetCount<T>(var SourceArr: TArray<T>; Item: T): integer;
var
  id: Integer;
begin
  id := 0;
  for var i := Low(SourceArr) to High(SourceArr) do
    if T(SourceArr[i]) = T(Item)  then
    begin
      inc(id)
    end;
  Result := id;
end;

procedure TForm1.btn3Click(Sender: TObject);
      var ss:tarray<string>;id :integer;

begin
  ss:=['a','b','a'];
  id:= TArrayUtil.GetCount<string>(ss,'a');
 ShowMessage(id.ToString );
end;
//结果应该是2,但结果是0
----------------------------------------------
-
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/6/2 12:45:35
37楼: 谨慎怀疑if T(SourceArr[i])=T(Item) then 这里,编译器能不能给通过。

至少我这里(11.3),泛型的T(a)=T(b)运算,编译器报错C2210。
----------------------------------------------
z@S7
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/2 16:36:59
38楼: @zhyhero 我这里是通过的 我也是11.3
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/6/3 2:56:50
39楼: @mp654kk

implementation

{$R *.dfm}

uses
  System.Rtti;

type
  TArrayUtil = class
  public
    class function GetCount<T>(var SourceArr: TArray<T>; Item: T): integer; static;
  end;

  { TArrayUtil }

class function TArrayUtil.GetCount<T>(var SourceArr: TArray<T>; Item: T): integer;
var
  LIsString: boolean;
  a, b     : string;
begin
  result := 0;
  //
  LIsString := (TValue.From<T>(Item).Kind = TTypeKind.tkUString  {... tkString, tkWString... + + +} );
  //
  for var V in SourceArr do
    begin
      if LIsString then
        begin
          a := TValue.From<T>(V).AsString;
          b := TValue.From<T>(Item).AsString;
          if SameText(a, b) then // comparing "string"
          inc(result);
        end          { }
      else          // another types...
        if (V = Item) then // comparing another types
          inc(result);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LArrValues: TArray<string>;
begin
  // LArrValues := [1, 5, 3, 4, 5, 6, 7, 5, 9];
  LArrValues := ['1', '5', '3', '4', '5', '6', '7', '5', '9'];
  // LArrValues := [Button1, Button2, Button3, Button4, Button5, Button2];
  //
  ShowMessage(TArrayUtil.GetCount<string>(LArrValues, '5').ToString + ' was found and counting...');
end;
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/6/3 3:44:32
40楼: var
  a : string;
  b : string;
begin
  if a = b then ...  ->   if A-address = B-address  then...

  if SameText(a, b) then -->  if ValueA = ValueB then ...
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/3 14:38:36
41楼: @emailx45 谢谢 看来是字符串的时候只能转换成字符串来比较 不能直接比较 是整数的时候可以直接比较
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/3 18:15:36
42楼: @emailx45 只能用TValue.From<T>(Item).Kind来获取T是什么类型吗 
假如我只有T但没有具体的T的变量比如Item 怎么直接知道T是什么类型的呢
----------------------------------------------
-
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/6/3 21:07:16
43楼: 场景,你是什么样的场景会出现只有T没有ITEM?

绝大多数情况下,都是procedure x<T>(y:T);这种。
----------------------------------------------
z@S7
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/4 17:44:12
44楼: 一般来说是有的 可以用TComparer<T>类来比较吗
----------------------------------------------
-
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/6/4 20:10:49
45楼: TComparer<T>的用法,可能和你想的有些差距。
https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generics_Defaults_TComparer_(Delphi)
此帖子包含附件:
PNG 图像
大小:26.1K
----------------------------------------------
z@S7
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/6/4 20:20:19
46楼: 对于泛型里的T,你可以用TypeInfo(T)来取得他的类型信息
例如:

function some<T,U>(v:T):U;

var
  PTI: PTypeInfo;
begin
  PTI:=TypeInfo(T);
  Print(PTI.NameFld.ToString);//输出的时string,integer,int64,TGUID,TDateTime等文本。
  PTI:=TypeInfo(U);
  Print(PTI.NameFld.ToString);

  Result:=U(...经过若干转换得出的U类型数据...);
end;


以我的经验,并不存在一个简单的方法funciton some<T,U>(v:T):U;能够解决一切类型的数据……,
----------------------------------------------
z@S7
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/6/5 2:11:30
47楼: you always need test what is type of the "T", for that exists RTTI records/classes

this information should be verifyed in run-time... there is not other way!

Class/Object/Record/Interfaces

using TValue is a easy way to get the information, but you can use another RTTI ways.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 flcop (flcop) ▲▲▲▲△ -
普通会员
2023/6/5 18:03:57
48楼: class function TArrayUtil.GetCount<T>(const ASourceArr: TArray<T>; const AItem: T; const AComparer: IComparer<T> = nil): NativeInt;
begin
  Result := 0;
  if Length(ASourceArr) > 0 then
  begin
    var LComparer := AComparer;
    if LComparer = nil then
      LComparer := TComparer<T>.Default;

    for var I := Low(ASourceArr) to High(ASourceArr) do
      if LComparer.Compare(ASourceArr[I], AItem) = 0 then
        Inc(Result);
  end;
end;
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/6/23 23:02:35
49楼: @zhyhero @emailx45  @flcop 方法确实可行,拓展了思路,感谢!
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2023/6/24 8:12:33
50楼: @wk_knife
lamda 就是匿名函数 谁说没有乐
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行1980.469毫秒 RSS