泛型 for to/in 遍历 PK 效率;TEnumerator、TEnumerable

再使用泛型的时候,经常需要用到遍历功能:

只要继承了 TEnumerator 或 TEnumerable 这两个抽象类的 都具有遍历功能。

当然没有继承这两个抽象类的 也具有使用 for in 来遍历的功能,编译器内置的,具体可以参见万一的博客:

http://www.cnblogs.com/del/archive/2008/11/12/1332011.html

举例:

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Generics.Collections,
  Vcl.StdCtrls;

type
  TForm5 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  /// <summary>
  /// 定义一个结构体
  /// </summary>
  RPerson = record
    name: string;
    age: Integer;
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
var
  mykey,myValue: string;
  MyDic: TDictionary<string, string>;
  MyDic2: TDictionary<string, RPerson>;
  I: Integer;
  person: RPerson;
begin
  MyDic := TDictionary<string, string>.Create();
  MyDic2 := TDictionary<string, RPerson>.Create();
  try
    //初始化
    Memo1.Lines.Clear;
    MyDic.Add(‘XiaoLi‘, ‘李飞刀‘);
    MyDic.Add(‘XiaoWang‘, ‘王中王‘);
    MyDic.Add(‘XiaoZhang‘, ‘张飞‘);

    person.name := ‘小李飞刀‘;
    person.age := 10;
    MyDic2.Add(‘XiaoLi‘, person);
    person.name := ‘火云邪神‘;
    person.age := 50;
    MyDic2.Add(‘XiaoHuo‘, person);

    //通过key来遍历
    for mykey in MyDic.Keys do
    begin
      Memo1.Lines.Add(mykey);
    end;
    Memo1.Lines.Add(‘‘);

    //通过value来遍历
    for myValue in MyDic.Values do
    begin
      Memo1.Lines.Add(myValue);
    end;
    Memo1.Lines.Add(‘‘);

    //通过结构体的值来遍历
    for person in MyDic2.Values do
    begin
      Memo1.Lines.Add(person.name);
    end;
  finally
    MyDic.Free;
    MyDic2.Free;
  end;
end;

end.

可见 遍历 的思想不能 仅仅局限于传统的 for i = 0 to list.cout -1 这种方法,而是应该多用 for in ,for in 可以遍历 一切, 传统的 for 循环  for in 都能实现。

遍历 可以 直接遍历 一切(基本类型、结构体、动态数组、类对象) 既然这样,那么问题 又来了 谁的效率高呢,我们来PK下。

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections;

type
  TForm5 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
var
  MyList,tempList1,tempList2: TStringList;
  I: Integer;
  start_time: Int64;
  tempStr: string;
begin
  MyList := TStringList.Create;
  tempList1 := TStringList.Create;
  tempList2 := TStringList.Create;
  try
    //先加进数据来
    for I := 0 to 100000 do
    begin
      MyList.Add(I.ToString);
    end;

    start_time := GetTickCount;
    for I := 0 to MyList.Count - 1 do
    begin
      //只有使用才能看到效果
      tempList1.Add(MyList[I]);
    end;
    Memo1.Lines.Add(‘fot to 耗时:‘ + (GetTickCount - start_time).ToString);

    start_time := GetTickCount;
    for tempStr in MyList do
    begin
      //只有使用才能看到效果
      tempList2.Add(tempStr);
    end;
    Memo1.Lines.Add(‘fot in 耗时:‘ + (GetTickCount - start_time).ToString);
  finally
    MyList.Free;
    tempList1.Free;
    tempList2.Free;
  end;
end;

end.

效率差不多,其它的就不测试了。 总之以后 不要把思维局限于 for to 而是 多用 for in

时间: 2024-10-01 11:44:48

泛型 for to/in 遍历 PK 效率;TEnumerator、TEnumerable的相关文章

HashMap的keySet遍历和entrySet遍历时间效率比较

import java.util.Calendar; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapTest { <span style="white-space:pre"> </span>public static void main(String[] args) { <

用for和while遍历HashMap效率测试

import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.Iterator; public class EntryTest { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); for (int i = 0;

C#中使用泛型对照使用通用基础类型效率减少近一倍

?? C#中使用泛型对照使用通用基础类型效率减少近一倍 以下是測试结果: CSharp class and generic TotalMilliseconds: 270772.9229CSharp generic TotalMilliseconds: 269963.3999CSharp normal TotalMilliseconds: 159716.9094 測试代码: using System; using System.Collections.Generic; using System.L

Java中HashMap(泛型嵌套)的遍历

//Studnet package yzhou.gen03; public class Student<T> { private T score; public T getScore() { return score; } public void setScore(T score) { this.score = score; } } //BjStu package yzhou.gen03; public class Student<T> { private T score; pub

C++11中对容器的各种循环遍历的效率比较

1 #include "CycleTimeTst.h" 2 #include <string> 3 #include <vector> 4 #include <list> 5 #include <limits> 6 #include <assert.h> 7 #include <QTime> 8 #include <QDebug> 9 10 class TimeUsedGuard 11 { 12 pub

ArrayList和LinkedList循环遍历效率探索(一)

一.Arraylist的遍历方式效率比较 实验代码: import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class TestListSpeed { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int index = 0; index <

C++ std::vector 三种遍历方式的效率比较

#include <iostream> #include <vector> #include <stdint.h> #include <ctime> int main() { const uint32_t loop = 1000000; std::vector<int32_t> vec; clock_t timeStart = 0; for (uint32_t i = 0; i < loop; ++i) { vec.push_back(i)

专题三、ArrayList遍历方式以及效率比较

一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: // 基本的forfor (int i = 0; i < size; i++){    value = list.get(i);} 2.第二种,foreach语句 foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. 代码如下: for (In

map遍历的几种方式和效率问题

一.map遍历的效率 先创建一个map,添加好数据: Map<String, String> map = new HashMap<>();for (int i = 0; i < 1000000; i++) { map.put(i + "", i + "AA");} 1.keySet的for循环方式: //只获取keypublic static void keySetForGetKey(Map<String, String>