练习 - 创建和配置 for 迭代循环
- 14 分钟
在表面上,该 for 语句是另一个迭代语句,可用于循环访问代码块,从而更改代码的执行流。 但在研究了每种迭代语句的运行原理后,就能更好地了解各迭代语句之间的细微差别以及应在何时使用它们。
什么是 for 语句?
该 for 语句遍历代码块特定次数。 此级别的控制使 for 语句在其他迭代语句中是唯一的。 该 foreach 语句对数组或集合等数据序列中的每个项循环访问一次代码块。 语句 while 循环访问代码块,直到满足条件。
此外,该 for 语句通过公开迭代条件来更好地控制迭代过程。
在本练习中,您将使用 for 语句,学习如何控制迭代的前提条件、终止条件、迭代模式等。 此外,你将了解语句的 for 常见用例。
接下来准备编码环境,并开始了解实现 for 语句的代码示例。
准备编码环境
本模块包括指导你完成生成和运行演示代码的过程的动手活动。 建议使用 Visual Studio Code 作为开发环境来完成这些活动。 使用 Visual Studio Code 来完成这些活动将帮助你在供全球专业人员使用的开发人员环境中更舒适地编写和运行代码。
打开 Visual Studio Code。
可以使用 Windows“开始”菜单(或等效资源 [对于其他 OS])打开 Visual Studio Code。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在“打开文件夹”对话框中,导航到 Windows“桌面”文件夹。
如果使用了其他文件夹位置来保存代码项目,可以改用该文件夹位置。 对于此训练,重要的是要有一个容易找到和记住的位置。
在“打开文件夹”对话框中,选择“选择文件夹”。
如果看到一个询问是否信任作者的安全对话框,请选择“是”。
在 Visual Studio Code 的“终端”菜单上,选择“新终端”。
请注意,“终端”面板中的命令提示符显示当前文件夹的文件夹路径。 例如:
C:\Users\someuser\Desktop>注释
如果你在自己的电脑上工作,而不是在沙盒或托管环境中工作,并且你已经完成此 C# 系列中的其他 Microsoft Learn 模块,那么你可能已经为代码示例创建了一个项目文件夹。 如果是这种情况,可以跳过下一步,该步骤用于在 TestProject 文件夹中创建控制台应用。
在终端命令提示符下,若要在指定文件夹中创建新的控制台应用程序,请输入以下提示:
dotnet new console -o ./CsharpProjects/TestProject此 .NET CLI 命令使用 .NET 程序模板在指定文件夹位置创建新的 C# 控制台应用程序项目。 该命令会自动创建 CsharpProjects 和 TestProject 文件夹,并使用 TestProject 作为
.csproj文件的名称。如果显示一条消息,告知文件已存在,请继续执行后续步骤。 你将重复使用现有的项目文件。
在 EXPLORER 视图中,展开 CsharpProjects 文件夹。
应会看到 TestProject 文件夹和两个文件:一个名为Program.cs的 C# 程序文件和一个名为 TestProject.csproj 的 C# 项目文件。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在 “打开文件夹 ”对话框中,选择 CsharpProjects 文件夹,然后选择“ 选择文件夹”。
在 EXPLORER 视图中,展开 TestProject 文件夹,然后选择 Program.cs。
删除现有代码行。
在本模块中,你将使用此 C# 控制台项目来创建、生成和运行代码示例。
关闭“终端”面板。
编写基本 for 语句
确保已打开 Visual Studio Code,并且“编辑器”面板中显示了 Program.cs。
注释
Program.cs 应为空。 如果不是,请选择并删除所有代码行。
在 Visual Studio Code 编辑器中键入以下代码。
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }此代码提供一个简单
for语句,该语句循环访问其代码块 10 次,并打印当前值i。在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在生成或运行代码之前,必须保存 Program.cs 文件。
在“EXPLORER”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。
终端面板将打开。 终端应包含一个命令提示符,显示终端已打开并指向你的 TestProject 文件夹位置。
在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。
注释
如果看到一条消息“找不到要运行的项目”,请确保终端命令提示符显示预期的 TestProject 文件夹位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>你会看到以下输出。
0 1 2 3 4 5 6 7 8 9花一分钟时间确定语句的
for六个部分。该
for语句包含以下六个部分:for关键字。- 一组括号,用于定义迭代条件
for。 该括号包含三个不同的部分,在语句运算符的末尾处由分号分隔。 - 第一部分定义并初始化迭代器变量。 在本示例中:
int i = 0。 本部分称为 初始值设定项。 - 第二部分定义完成条件。 在本示例中:
i < 10。 换句话说,运行时将继续循环访问语句下面的for代码块中的代码,而i小于10。 当i等于10时,运行时将停止执行for语句的代码块。 文档将本节称为 条件。 - 第三部分定义了每次迭代后要采取的行动。 在这种情况下,每次迭代后,
i++将值i递增 1。 文档将本部分称为 迭代器。 - 最后来说说代码块。 代码块包含将为每个迭代执行的代码。 请注意,在代码块内部引用了
i的值。 文档将本节称为 正文。
鉴于命名变量的规则,你可能想知道
i是否是保存当前迭代的变量的有效名称。 在这种情况下,i大多数人认为是有效的。 其他受欢迎的选择是x和counter。 当你有一个使用j的外部for语句,并且需要为内部i语句创建迭代变量时,这些情况下也会使用名称for。注释
所有三个部分(初始值设定项、条件和迭代器)都是可选的。 但是,在实践中,通常使用这三个部分。
更改迭代条件
正如我们在一开始就指出的,该 for 语句在迭代语句中具有两个独特的品质。
for当你知道需要提前循环访问代码块的次数时,应使用该语句。- 该
for语句允许你控制每个迭代的处理方式。
如果我们需要遍历代码块,但想要倒数而不是递增计数,该怎么办?
使用 Visual Studio Code 编辑器更新代码,如下所示:
for (int i = 10; i >= 0; i--) { Console.WriteLine(i); }花点时间查看更新的代码。
通过更改语句的
for三个部分,我们更改其行为。- 我们将迭代变量初始化为 10。
- 我们将完成条件更改为在
for小于i时退出0语句。 - 我们更改迭代器的模式,每次完成迭代时,从
1减去i。
保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意,输出已更改。
运行代码时,你将看到以下输出。
10 9 8 7 6 5 4 3 2 1 0
试验迭代器的模式
如果想要跳过迭代器变量中的某些值,该怎么办?
使用 Visual Studio Code 编辑器更新代码,如下所示:
for (int i = 0; i < 10; i += 3) { Console.WriteLine(i); }花点时间查看更新的代码。
与其用
1递增或递减迭代器变量的值,我们使用i += 3在每次迭代后跳过两个值。保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意输出的更改方式。
运行代码时,你将看到以下输出。
0 3 6 9诚然,你不常这样做,但希望你能够意识到,如果你需要,你可以细致地掌控迭代的各个层面。
使用 break 关键字中断迭代语句
如果需要根据某些条件提前退出迭代语句,该怎么办? 可以使用 break 关键字。
使用 Visual Studio Code 编辑器更新代码,如下所示:
for (int i = 0; i < 10; i++) { Console.WriteLine(i); if (i == 7) break; }花点时间查看关键字
break在更新代码中的使用。我们首先在模块中看到关键字
break“使用 C# 中的 switch-case 构造对代码流进行分支”。 事实证明,我们也可以使用break关键字退出迭代语句。保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意输出的更改方式。
运行代码时,你将看到以下输出。
0 1 2 3 4 5 6 7
循环访问数组中的每个元素
语句的 for 一个常见用法是循环访问元素数组,尤其是在需要对迭代发生的方式进行一些控制时。 当foreach 迭代访问数组的每个元素时,可以调整for 语句以提供更多自定义选项。
使用 Visual Studio Code 编辑器更新代码,如下所示:
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = names.Length - 1; i >= 0; i--) { Console.WriteLine(names[i]); }花点时间查看更新的代码。
首先,请注意,我们实例化了一个名为
names包含四个名称的字符串数组。接下来,请注意,我们使用
Array.Length属性来获取数组中的元素数,并使用此值初始化迭代器变量(int i = names.Length - 1)。 我们从值中减去 1,因为数组元素的索引号是从零开始的(四个元素的索引号是 0-3)。最后,请注意,我们已选择从后向前遍历数组,这是无法使用
foreach语句进行的操作。 我们使用代码块内的迭代变量的值来指定数组元素的索引号(names[i])。保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意,数组元素按相反顺序列出(如预期所示)。
运行代码时,你将看到以下输出。
Michael David Eddie Alex注释
我们可以通过构造
for语句来循环访问数组元素,如下所示:for (int i = 0; i < names.Length; i++)
了解 foreach 语句的限制
如果要在迭代期间 foreach 更新数组中的值,该怎么办?
使用 Visual Studio Code 编辑器更新代码,如下所示:
string[] names = { "Alex", "Eddie", "David", "Michael" }; foreach (var name in names) { // Can't do this: if (name == "David") name = "Sammy"; }保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意显示的错误消息。
如果尝试编译并运行此代码,将看到异常。
Cannot assign to name because it is a 'foreach iteration variable'换句话说,您无法重新赋值
name,因为它是foreach迭代的内部实现的一部分。
使用 for 语句克服 foreach 语句的局限性
让我们尝试使用 for 语句修改迭代代码块中数组的内容。
使用 Visual Studio Code 编辑器更新代码,如下所示:
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = 0; i < names.Length; i++) if (names[i] == "David") names[i] = "Sammy"; foreach (var name in names) Console.WriteLine(name);花点时间查看更新的代码。
请注意,我们从仅包含单个代码行的代码块中删除大括号。 此修订使用我们在模块“使用 C# 中的代码块控制变量范围和逻辑”中讨论的相同技术。 许多开发人员发现这种样式难以阅读,而其他人则更喜欢这种缩写样式,因为它有助于他们更简洁、更有表现力地编写。 如果发现此代码难以阅读,或者只是不喜欢此样式,请放心,大括号始终可以在代码块中使用。 如果需要,请使用以下代码更新编辑器面板中的代码:
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = 0; i < names.Length; i++) { if (names[i] == "David") { names[i] = "Sammy"; } } foreach (var name in names) { Console.WriteLine(name); }保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意,代码在没有错误的情况下运行,并生成所需的输出。
运行代码时,你将看到以下输出。
Alex Eddie Sammy Michael由于数组不是迭代语句实现的直接部分,因此可以在数组内更改值。
回顾
下面是本单元的一些要点:
- 迭代
for语句允许循环访问特定次数的代码块。 - 迭代
for语句允许通过更改括号内的三个条件来控制迭代机制的各个方面:初始值设定项、条件和迭代器。 - 需要控制如何循环访问数组中的每个项时,通常使用
for该语句。 - 如果代码块只有一行代码,则可以根据需要消除大括号和空格。