首页
/ freeCodeCamp C 课程实战:用 do-while 与 while 为控制台应用添加循环逻辑(Add Logic to C Console Applications 挑战详解)

freeCodeCamp C 课程实战:用 do-while 与 while 为控制台应用添加循环逻辑(Add Logic to C Console Applications 挑战详解)

2026-09-05 09:36:20作者:卓炯娓

本文为 freeCodeCamp 开源课程(foundational-c-sharp-with-microsoft 超级块)中「Add Looping Logic to Your Code Using the do-while and while Statements in C#」挑战的完整解读:它说明该挑战在课程体系中的位置、完成方式(外部 Microsoft Learn 模块 + 站内测验题)、do/while/for/foreach 四类循环语句的选型原理,以及挑战内容在仓库中从 Markdown 源文件到页面渲染的落地方式。读完本文,你既能掌握 C# 循环语句的选择依据,也能了解 freeCodeCamp 如何将这类「混合型」课程挑战组织进课程结构与前端渲染管线。

挑战概览:一个 challengeType 19 的混合式课程文件

该挑战的源文件位于 curriculum/challenges/english/blocks/add-logic-to-c-sharp-console-applications/647e1f4e8acb466c97ccbedf.md,文件头部的 frontmatter 声明了三个关键字段:

id: 647e1f4e8acb466c97ccbedf
title: Add Looping Logic to Your Code Using the do-while and while Statements in C#
challengeType: 19
dashedName: add-looping-logic-to-your-code-using-the-do-while-and-while-statements-in-c-sharp
  • id 是挑战的唯一标识,在课程数据、Gatsby 节点与测验判分中贯穿使用;
  • dashedName 决定挑战页 URL 的末段(例如 /learn/foundational-c-sharp-with-microsoft/add-logic-to-c-sharp-console-applications/... 中的定位依据);
  • challengeType: 19 表明它属于「泛型挑战」(generic challenge)——不内嵌编辑器与测试代码,而是引导用户在外部平台完成操作后回到站内答题。从源码结构看,这类挑战由 client/src/templates/Challenges/generic 模板渲染,其测试夹具正是以同样为 challengeType 19 的 C# 挑战("Write Your First C# Code")构造数据并校验了 challengeType: 19superBlock: SuperBlocks.FoundationalCSharp、外部 Microsoft Learn 链接赋值(assignments)与单选 questions 的完整数据结构。

完成流程:Microsoft Learn 模块 + 站内单选测验

源文件的 --description----assignment-- 部分给出了明确的两步完成流程:

  1. 前往 Microsoft Learn 平台,完成 "Add Looping Logic to Your Code Using the do-while and while Statements in C#" 培训模块中的全部任务。原文特别强调:这一步是必需(required) 的——只有完成该模块,才能在 Microsoft Learn 上获得 "Add Logic to C# Console Applications" 奖杯,并有资格参加认证考试;
  2. 完成后回到 freeCodeCamp,正确回答下方的选择题。

这与同块内其他挑战的模式完全一致,例如 for 语句挑战(要求完成 Microsoft Learn 的 for 语句模块后回答「哪条 for 语句写法正确」)和 分支/循环挑战项目(要求回答「什么条件下 while 比 do 更合适」)。这种「外部实操 + 站内知识检验」的双轨设计,是 C# 课程把动手环境交给 Microsoft Learn、把进度与认证闭环留在 freeCodeCamp 的体现。

挑战题目解析:遍历数组查找匹配项应选哪个迭代语句

源文件 --questions-- 部分的完整题目是:

A developer needs to iterate through an array of items to find one that matches a certain criteria. Which is the best iteration statement for this purpose?

三个选项为 foreachforwhile--video-solution-- 字段标记正确答案索引为 1(即第一项,foreach)。

为什么答案是 foreach

  • foreach 语句专为「遍历集合/数组中的每一个元素」而设计,直接对每个元素做模式匹配式访问(foreach (var item in items)),无需手动维护索引,查找「满足某条件的一项」时只需在循环体内写条件判断,必要时 break 提前退出即可;
  • for 需要显式管理计数器(for (int i = 0; i < items.Length; i++)),虽然也能完成查找,但引入了索引边界这一额外出错面,可读性与意图表达都不如 foreach 直接;
  • while 适用于「循环次数事先未知、由运行时条件驱动」的场景,用它手写索引遍历数组属于反模式。

这与本块挑战项目题(647e21598acb466c97ccbee1.md)中考察的结论互为印证:while 的适用条件是「进入循环前,表达式的求值结果未知」,其核心价值在于条件驱动的未知次迭代,而不是替代集合遍历语句。

do-while 与 while:本挑战的主题语句

挑战标题所指的 Microsoft Learn 模块聚焦两个「条件驱动」的循环语句。两者的语义差异可以用最小示例说清:

// while:先判断条件,再执行循环体;条件一开始为假时,循环体一次都不执行
while (count < 5)
{
    Console.WriteLine(count);
    count++;
}

// do-while:先执行一次循环体,再判断条件;循环体至少执行一次
do
{
    Console.WriteLine(count);
    count++;
} while (count < 5);

两者都要求条件表达式为 bool,且都支持在循环体内用 break/continue 控制流程。选型要点可以归纳为:

语句 判断时机 执行次数保证 典型场景
while 执行循环体之前判断 可能为 0 次 条件未知、可能一次都不需要执行
do-while 执行循环体之后判断 至少 1 次 菜单循环、输入重试(必须至少读取一次输入)
for 每轮之前判断 可能为 0 次 已知迭代次数或索引边界
foreach 每轮之前判断 集合空则为 0 次 遍历集合/数组、查找满足条件的元素

挑战在课程块中的位置:从逻辑结构到认证考试

块级编排文件 curriculum/structure/blocks/add-logic-to-c-sharp-console-applications.jsonchallengeOrder 数组定义了本块的完整学习路径(第 5–38 行):

  1. 647e21708acb466c97ccbee3 — Evaluate Boolean Expressions to Make Decisions in C#(布尔表达式决策)
  2. 647e21658acb466c97ccbee2 — Control Variable Scope and Logic Using Code Blocks in C#(代码块与作用域)
  3. 647e214b8acb466c97ccbee0 — Branch the Flow of Code Using the switch-case Construct in C#(switch-case 分支)
  4. 647e218f8acb466c97ccbee5 — Iterate Through a Code Block Using the for Statement in C#(for 循环)
  5. 647e1f4e8acb466c97ccbedf — Add Looping Logic to Your Code Using the do-while and while Statements in C#(本文主角)
  6. 647e217e8acb466c97ccbee4 — Guided Project: Develop Conditional Branching and Looping Structures in C#(引导项目)
  7. 647e21598acb466c97ccbee1 — Challenge Project: Develop Branching and Looping Structures in C#(挑战项目)
  8. 647f882207d29547b3bee1c0 — Trophy: Add Logic to C# Console Applications(奖杯)

可以看到,do-while/while 挑战处于「决策 → 分支 → for 循环」之后、「两个综合项目 + 奖杯」之前,是循环知识线的收尾环节:先学计数型循环(for),再学条件型循环(while/do-while),最后通过项目巩固并领取奖杯。块配置中的 "blockLayout": "legacy-challenge-list" 字段则决定了该块在学员端的列表呈现方式。

在更大尺度上,该块是 foundational-c-sharp-with-microsoft 超级块的一部分,见 curriculum/structure/superblocks/foundational-c-sharp-with-microsoft.json,其 blocks 数组按学习顺序包含:

  1. write-your-first-code-using-c-sharp
  2. create-and-run-simple-c-sharp-console-applications
  3. add-logic-to-c-sharp-console-applications(本块)
  4. work-with-variable-data-in-c-sharp-console-applications
  5. create-methods-in-c-sharp-console-applications
  6. debug-c-sharp-console-applications
  7. foundational-c-sharp-with-microsoft-certification-exam(认证考试)

也就是说,完成本挑战(包括其外部模块与站内测验)是通往 C# 认证考试资格链条中的一环。

仓库中的实现证据:从 Markdown 到渲染页面

从源码结构看,这条挑战链在仓库中的落地链路可以归纳为:

  1. 内容源:挑战以带 frontmatter 的 Markdown 存放在 curriculum/challenges/english/blocks/add-logic-to-c-sharp-console-applications/ 下,目录中 8 个文件与结构文件中的 8 条 challengeOrder 一一对应,题目、选项、--video-solution-- 答案索引全部内嵌于 Markdown 中;
  2. 结构编排curriculum/structure/blocks/*.json 定义块内顺序与布局,curriculum/structure/superblocks/*.json 定义块在超级块中的顺序,课程构建工具(curriculum/src 下的 get-challenges/filter 等)据此组装挑战节点;
  3. 前端渲染:challengeType 19 走 generic 挑战模板。client/src/templates/Challenges/generic/show.test.tsx 展示了这类挑战经 Gatsby 静态查询(challengeNode)后得到的数据结构:assignments(外部模块指引)、questions(含答案与 solution 索引)、fields.slug 等,测试夹具同时验证了 challengeType: 19 的页面元信息(challengeMeta)装配方式。

这套「Markdown 内容 + JSON 编排 + 类型化渲染」的组合,正是 freeCodeCamp 能把数千个挑战(包括与 Microsoft Learn 联动的 C# 挑战)以可校验、可翻译、可测试的方式维护在一个开源仓库中的关键。

小结与延伸阅读

本挑战本身不长,但它承载了三个层次的技术信息:

  • C# 语言层do/while 是条件驱动循环,循环体执行次数不预先确定;集合遍历与「按条件查找元素」应优先选择 foreach
  • 课程工程层:freeCodeCamp 用 challengeType: 19 + 外部平台模块 + 站内单选的混合模式,把实操放在 Microsoft Learn、把进度与认证闭环留在站内;
  • 仓库结构层:挑战顺序由块/超级块两级 JSON 声明式编排,前端按挑战类型分发渲染模板。

如需继续深入,可按以下路径查看(均为仓库相对路径):

登录后查看全文
热门项目推荐
相关项目推荐