TSuperEnumerator、TSuperAvlIterator、ObjectFindFirst

通过 ISuperObject.GetEnumerator 可获取一个 TSuperEnumerator 对象.

TSuperEnumerator 主要有: MoveNext 方法、Current 属性; 使用举例:


var
  jo: ISuperObject;
  e: TSuperEnumerator;
begin
  jo := SO(‘{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}‘);
  e := jo.GetEnumerator;
  while e.MoveNext do
  begin
    ShowMessage(e.Current.AsString);
  end;
  e.Free;
end;

//上面程序其实没有实用价值, 因为下面一句话就可以代替上面这些:
var
  jo,i: ISuperObject;
begin
  jo := SO(‘{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}‘);
  for i in jo do ShowMessage(i.AsString);
end;


同通过 TSuperEnumerator 枚举出的只有 Name:Value 中的 Value;

通过 TSuperAvlIterator 枚举出的是 TSuperAvlEntry 对象(其包含 Name 和 Value);

获取 TSuperAvlIterator 方法:
TSuperTableString.GetEnumerator 或者 ISuperObject.AsObject.GetEnumerator.


var
  jo: ISuperObject;
  ite: TSuperAvlIterator;
begin
  jo := SO(‘{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}‘);

  ite := jo.AsObject.GetEnumerator;

  ite.First;
  ShowMessageFmt(‘%s : %s‘, [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Next;
  ShowMessageFmt(‘%s : %s‘, [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Last;
  ShowMessageFmt(‘%s : %s‘, [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Prior;
  ShowMessageFmt(‘%s : %s‘, [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Free;
end;


ObjectFindFirst、ObjectFindNext、ObjectFindClose 是 SuperObject 给的另一种枚举元素的方式.

它用到了一个结构:


TSuperObjectIter = record
  key: SOString;
  val: ISuperObject;
  Ite: TSuperAvlIterator;
end;

//应用举例:
var
  jo: ISuperObject;
  iter: TSuperObjectIter;
begin
  jo := SO(‘{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}‘);

  if ObjectFindFirst(jo, iter) then
  begin
    repeat
      ShowMessageFmt(‘%s - %s‘, [iter.key, iter.val.AsString]);
    until not ObjectFindNext(iter);
  end;
  ObjectFindClose(iter);
end;

//或者:
var
  jo: ISuperObject;
  iter: TSuperObjectIter;
begin
  jo := SO(‘{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}‘);

  if ObjectFindFirst(jo, iter) then
  begin
    repeat
      ShowMessageFmt(‘%s - %s‘, [iter.Ite.Current.Name, iter.Ite.Current.Value.AsString]);
    until not ObjectFindNext(iter);
  end;
  ObjectFindClose(iter);
end;
时间: 2024-08-13 15:45:07

TSuperEnumerator、TSuperAvlIterator、ObjectFindFirst的相关文章

JSON 之 SuperObject(12): TSuperEnumerator、TSuperAvlIterator、ObjectFindFirst...

通过 ISuperObject.GetEnumerator 可获取一个 TSuperEnumerator 对象. TSuperEnumerator 主要有: MoveNext 方法.Current 属性; 使用举例: var   jo: ISuperObject;   e: TSuperEnumerator; begin   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}');   e := jo.GetEnumerator

css中的px、em、rem 详解

概念介绍: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选.Windows系统默认是96dpi,Apple系统默认是72dpi. 2.em(相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等.通常1em=16px

eclipse插件之Findbugs、Checkstyle、PMD安装及使用

一.什么是Findbugs.checkstyle.PMD Findbugs.checkstyle和PMD都可以作为插件插入eclipse,当然也有单独的工具可以实现他们的功能,比如Findbugs Tool就可以不必插入eclipse就可以使用. 三者的功能如下表: 工具 目的 检查项 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug 主要检查bytecode中的bug patterns,如NullPoint空指

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

C# 远程服务器 创建、修改、删除 应用程序池 网站

首先 C# 操作 站点 需要 引用Microsoft.Web.Administration.dll 文件,创建站点我们一般需要 远程服务的IP,网站名称.端口.物理路径:这里默认网站名称和应用程序池名称一致. 应用程序池默认不启动,应为刚创建站点是没有对应真实的物理文件,修改 队列长度.启动模式.回收时间.最大工作进程, 以及日志路径.修改的时候如果修改站点物理路径的话,我们需要把文件 从旧得目录拷贝到新的目录下,删除站点就比较简单了. 但是站点应用程序池的停止 和启动就比较难搞了,不是调用st

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

mysql中int、bigint、smallint和tinyint的区别与长度

对比发现 int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int             -------     int(11) bigint       -------     bigint(20) smallint   -------     smallint(6) tinyint     -------     tinyint(4) 下面是这几种类型的取值范围 参考:http://www.2cto.com/d

一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML 5.CSS 3.JavaScript 跨平台框架:React Native.Cordova 前端工程化:Grunt.Gulp.Webpack 前端预编译:Babel.Sass.Less 自动化测试:Jasmine.Mocha.Karma 一图在手,应有尽有! 更多信息参考:https://item.jd.com/12170351.h