Object Pascal 学习笔记,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸
3.4.1 For-in 循环
Object Pascal
具有专门的循环结构,用于循环访问列表或集合的所有元素,称为for-in
(其他编程语言称为for each
)。在这个循环中,该循环作用于数组、列表、字符串或其他类型容器中的每个元素。与C#不同,Object Pascal不需要实现IEnumerable
接口,尽管内部实现有些类似。
让我们从一个非常简单的容器开始,即字符串,它可以被视为字符的集合。我们已经在上一节末尾看到了如何使用for
循环操作字符串的所有元素。通过以下基于字符串的for-in
循环,其中Ch
变量依次接收字符串的每个元素,可以获得完全相同的效果:
var
S: string;
Ch: Char;
begin
S := 'Hello world';
for Ch in S do
Show(Ch);
该代码片段也是ForTest
示例的一部分。与使用传统for
循环相比,使用for-in
循环的优势在于您无需记住字符串的第一个元素以及如何提取最后一个元素的位置。这个循环更容易编写、维护,并且具有相类似的效率。
与传统的for
循环一样,for-in
循环也可以从使用内联变量声明中受益。我们可以使用以下等效代码重写上述代码:
var
S: string;
begin
S := 'Hello world';
for var Ch: Char in S do
Show(Ch);
for-in
循环可用于访问多种不同数据结构中的元素,包括:
- 字符串中的字符(参见前面的代码片段)
- 集合中的活动值
- 静态或动态数组中的项,包括二维数组(在第5章中介绍)
- 具有
GetEnumerator
支持的类引用的对象,包括许多预定义的对象,例如字符串列表中的字符串、各种容器类的元素、窗体拥有的组件等。如何实现这一点将在第10章中讨论。
现在在本书的这一部分覆盖这些高级用法模式可能有点困难,因此我将在本书的后面回到这个循环的示例。
注解:在某些语言(如 JavaScript)中,for-in 循环的运行速度非常慢,因此声名狼藉。但在 Object Pascal 中情况并非如此,它与标准 for 循环所需的时间差不多。为了证明这一点,我在 LoopsTest 示例中添加了一些计时代码,首先创建一个包含 3000 万个元素的字符串,然后用这两种类型的循环对其进行扫描(每次迭代都进行一个非常简单的操作)。在速度上,与传统 for 循环的差异约为 10%(在我的 Windows 机器上为 62 毫秒对 68 毫秒)。