Delphi - For In 及类遍历

首先我们要知道哪些类型可以用For In,下面就是:

  • for Element in ArrayExpr do Stmt;      数组
  • for Element in StringExpr do Stmt;    字符串
  • for Element in SetExpr do Stmt;         集合
  • for Element in CollectionExpr do Stmt;   集合
  • for Element in Record do Stmt;         结构体


我们来看例子:

type

THuangJacky = (hjA,hjB,hjC,hjD);

TJackyHuang = record

        a,b,c:Integer;

end;

const

        stringExpr='HuangJacky';

        arrayExpr:array[0..5] of Integer= (1,2,3,4,5,6);

        setExpr:set of THuangJacky = [hjA,hjB,hjD];

procedure TForm1.FormCreate(Sender: TObject);

var

        I:Integer;

        C:Char;

        D:THuangJacky;

        F:TComponent;

begin

for c in stringExpr do

        ShowMessage(C);

for i in arrayExpr do

        ShowMessage(IntToStr(i));

for d in setExpr do

        ShowMessage(IntToStr(Ord(d)));

for F in Self do

        ShowMessage(f.Name);

end;


是不是很爽呀?哈哈,Delphi也与时俱进呀.

之前写了类助手文章中,老赵问是不是扩展方法,因为对C#没有了解到这么多,所以不知道.
那么我们在Java中要For In必须实现Iterator.
那么Delphi的会不会也要呢?
是的,如果我们要自己的类支持For In的话,就必须满足下面的条件:
1
必须有个公共方法GetEnumerator(),这个方法返回值是一个类,接口或者记录体.
2
上面返回的类,接口或者记录体中又必须有公共方法MoveNext(),这个方法的返回值是Boolean.
3 1
中返回的类,接口或者记录体中必须有一个只读的属性Current,类型要和集合中的元素一样.

说了这么多,看个例子:

type

  TMyIntArray = array of Integer;

 

  TTest = class

    Values: TMyIntArray;

    Index:  Integer;

  public

    constructor Create;

    function GetCurrent: Integer;

    function MoveNext:   Boolean;

    property Current:    Integer read GetCurrent;

  end;

 

  TMyContainer  = class

  public

   function GetEnumerator: TTest;

  end;

 

constructor TTest.Create;

begin

  inherited Create;

  Values := TMyIntArray.Create(100, 200, 300);

  Index := -1;

end;

 

function TTest.MoveNext: Boolean;

begin

  if Index < High(Values) then

    begin

      Inc(Index);

      Result := True;

    end

  else

    Result := False;

end;

 

function TTest.GetCurrent: Integer;

begin

  Result := Values[Index];

end;

 

function TMyContainer.GetEnumerator: TTest;

begin

  Result := TTest.Create;

end;

 

var

  MyContainer: TMyContainer;

  I: Integer;

 

  Counter: Integer;

 

begin

  MyContainer := TMyContainer.Create;

 

  Counter := 0;

  for I in MyContainer do

    Inc(Counter, I);

 

  WriteLn('Counter = ', Counter);

end.

 

居然发现TMyIntArray可以用Create方法来创建数组,这个下去去研究下,或者万一兄已经研究过了.

好了,今天就到这里,我是DH.

 

原文地址:https://www.cnblogs.com/luckForever/p/7255012.html