• 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.

     

  • 相关阅读:
    django orm
    CentOS7.4 安装mongodb
    Django之logging日志
    Python virtualenv虚拟环境
    不能通过IP访问Docker容器里的Django服务器
    docker学习7-Dockerfile制作自己的镜像文件
    docker学习6-docker-compose容器集群编排
    docker学习5-docker安装tomcat环境和部署war包
    docker学习4-docker安装mysql环境
    深度学习和神经网络的区别
  • 原文地址:https://www.cnblogs.com/luckForever/p/7255012.html
Copyright © 2020-2023  润新知