首页
/ 攻克 freeCodeCamp「C 数组与 foreach 语句」挑战:语法考点与 Foundational C 认证路径详解

攻克 freeCodeCamp「C 数组与 foreach 语句」挑战:语法考点与 Foundational C 认证路径详解

2026-09-07 13:05:03作者:何举烈Damon

本文以 freeCodeCamp 英文课程中 create-and-run-simple-c-sharp-console-applications 模块内编号 647e22058acb466c97ccbeec 的挑战文档为核心,全面解析其任务流程、课程定位与配套测验考点,并结合 C# 数组与 foreach 语句的底层语法与常见误区给出可复现的代码示例。读完本文,你不仅能正确回答挑战末尾的语法判断题,还能理解 foreach 只读遍历的本质,并将其与 if / else if 结构组合完成真实的数据处理任务。

这份挑战文档记录了什么

被关联的文档位于 curriculum/challenges/english/blocks/create-and-run-simple-c-sharp-console-applications/647e22058acb466c97ccbeec.md,文件名为 Store and Iterate Through Sequences of Data Using Arrays and the foreach Statement in C#。从 front-matter 可以看出它包含以下元信息:

  • id: 647e22058acb466c97ccbeec:挑战的唯一 ID,被课程结构文件所引用;
  • challengeType: 19:标识这是一道「先完成外部学习模块、再返回平台作答」的视频/测验型挑战;
  • dashedName: store-and-iterate-through-sequences-of-data-using-arrays-and-the-foreach-statement-in-c-sharp:用于 URL 与文件命名的短横线形式标题。

挑战正文 (--description--) 与作业部分 (--assignment--) 规定了完整的通关流程:

  1. 前往 Microsoft Learn 平台,完成 Store and Iterate Through Sequences of Data Using Arrays and the foreach Statement in C#(对应模块路径为 csharp-arrays)的全部任务——这是必需步骤;
  2. 完成上述模块后回到 freeCodeCamp,正确回答文末的单项选择题;
  3. 只有通过该测验,才能向 Microsoft Learn 的 Create and Run Simple C# Console Applications 奖杯(trophy)要求迈进一步,进而获得参加认证考试的资格。

最后,文档通过 --video-solution--: 3 字段标明了单选题的标准答案——第 3 个选项 foreach (int value in values)。整个文档体现了 freeCodeCamp 与 Microsoft Learn 的混合式教学模式:外部平台的交互式任务负责「学」,平台内的选择题负责「测」

在 Foundational C# with Microsoft 课程体系中的位置

要理解这道挑战的分量,需要先定位它所在的课程层级。freeCodeCamp 将 C# 相关内容组织为「认证(certification)→ 超板块(superblock)→ 板块(block)→ 挑战(challenge)」的四级结构:

本挑战所属的板块结构文件 curriculum/structure/blocks/create-and-run-simple-c-sharp-console-applications.json 清晰地列出了该板块内 8 道挑战的先后顺序:

顺序 挑战标题 类型
1 Install and Configure Visual Studio Code 测验型
2 Call Methods From the .NET Class Library Using C# 测验型
3 Add Decision Logic to Your Code Using if, else, and else if statements in C# 测验型
4 Store and Iterate Through Sequences of Data Using Arrays and the foreach Statement in C#(本文主题) 测验型
5 Create Readable Code with Conventions, Whitespace, and Comments in C# 测验型
6 Guided Project - Develop foreach and if-elseif-else Structures to Process Array Data in C# 测验型
7 Challenge Project - Develop foreach and if-elseif-else Structures to Process Array Data in C# 测验型
8 Trophy - Create and Run Simple C# Console Applications 奖杯验证型

可以看出:本文挑战恰好处于板块中段,紧接其后的两道项目型挑战(Guided Project 与 Challenge Project)都以「用 foreach + if-elseif-else 处理数组数据」为核心,因此本挑战所考察的语法基本功直接决定后续项目能否顺利推进;板块最后 647f87dc07d29547b3bee1bf.md 是奖杯验证挑战,只有把整个板块全部完成后才会通过验证并解锁认证考试资格。

C# 数组:序列化存储数据的基本结构

在进入 foreach 之前,先建立对数组这一「序列容器」的完整认知。C# 数组是一组类型相同、大小固定、内存连续的元素集合,一旦创建其长度不可改变。

声明与初始化

常见方式如下:

// 方式一:先声明后赋值
int[] values;
values = new int[4];          // 长度为 4 的数组,元素默认值为 0
values[0] = 10;
values[1] = 20;

// 方式二:声明时初始化集合表达式
string[] pallets = { "B14", "A11", "C06" };

// 方式三:使用 new 关键字并直接提供初始值
double[] scores = new double[] { 9.5, 8.0, 7.5, 10.0 };

数组类型写作 int[]string[]double[] 等——方括号紧跟元素类型,而不是元素名(这是与某些语言相反的习惯,也是常见书写错误来源)。

索引与长度

数组元素通过从 0 开始的整数下标访问,Length 属性返回元素总数:

string[] pallets = { "B14", "A11", "C06" };
Console.WriteLine(pallets.Length);   // 输出 3
Console.WriteLine(pallets[0]);       // 输出 B14

pallets[2] = "C07";                  // 按下标修改元素

访问下标时务必注意边界:有效区间是 0Length - 1。若写成 pallets[3] 会抛出 IndexOutOfRangeException,运行时异常是初学者最常见的失分点之一。

数组是引用类型

数组在 C# 中属于引用类型。将数组赋值给另一个变量时,两者指向同一块内存:

int[] a = { 1, 2, 3 };
int[] b = a;
b[0] = 99;
Console.WriteLine(a[0]);   // 输出 99,说明 a、b 共享底层数据

理解这一特性,有助于理解后续 foreach 遍历时元素共享引用的行为(当元素本身是引用类型时,在循环体内修改其成员是允许且会生效的)。

foreach 语法:写法、执行语义与易错点

foreach 是 C# 中遍历「可枚举集合」的首选结构。凡是实现了 IEnumerable / IEnumerable<T> 的类型(数组、List<T>、字符串、字典等)都可以被它遍历。

标准语法模板

foreach (元素类型 局部变量名 in 集合名)
{
    // 循环体:每次迭代,局部变量被绑定到当前元素
}

语法中有三个关键组成:

  1. 括号内第一个成分是元素类型与局部变量声明,例如 int value,声明在循环体内使用的只读局部变量;
  2. in 关键字用于连接「局部变量」与「要遍历的集合」,这是 C# 规定的唯一合法连接词;
  3. 每次迭代,编译器会把集合中的当前元素自动赋给该局部变量,循环体执行完后进入下一个元素,直到集合穷尽。

遍历 int 数组的完整示例

int[] values = { 10, 20, 30, 40 };

foreach (int value in values)
{
    Console.WriteLine(value);
}

// 依次输出:
// 10
// 20
// 30
// 40

借助 C# 的隐式类型推断,元素类型可以简写为 var

foreach (var value in values)
{
    Console.WriteLine(value);
}

遍历 string[]List<T> 等同样适用同一套写法:

string[] names = { "Alice", "Bob", "Carol" };
foreach (string name in names)
{
    Console.WriteLine($"Hello, {name}!");
}

foreach 的三个易错语义

  • 循环内不允许重赋值循环变量value 在每次迭代时是只读的,value = 100; 会触发编译错误。如果需要修改数组元素本身,应改用带下标的 for 循环:
    for (int i = 0; i < values.Length; i++)
    {
        values[i] = values[i] * 2;   // 允许,因为走的是下标
    }
    
  • 不要在遍历过程中增删集合元素foreach 底层基于枚举器(enumerator),迭代期间修改集合会使枚举器失效并抛出 InvalidOperationException。若确需增删,应先将目标复制到一个新集合或改用 for 反向遍历。
  • 遍历次数由集合大小自动决定foreach 不依赖你手写的边界条件,因此数组长度变化时循环体会自动适应。这正是同板块后续挑战(见下)所考察的重点之一。

为什么连接词必须是 in

C# 语言规范中 foreach 语句使用关键字 in 连接遍历变量与集合:foreach (int value in values)。这里 in 是语言级关键字,负责将集合元素逐个「注入」局部变量。若误写成其他连接词(例如仿照其他语言的 of),编译器会直接报语法错误——这正好是本挑战测验题的命题核心。

测验考点逐项剖析

文档末尾的单选题题干为:Which of the following foreach statements is syntactically correct?(下列哪条 foreach 语句语法正确),三个候选及分析如下:

选项 写法 判定 原因
1 foreach (int value of values) of 并非 C# 的遍历连接词(for...of 是 JavaScript 的语法),在 C# 中会引发编译错误
2 foreach (int value with values) with 在 C# 中另有用途(对象初始化、switch 表达式等场景),不能充当 foreach 的连接词
3 foreach (int value in values) 完全符合 C# 语法:声明元素类型 int、局部变量 valuein 关键字、集合名 values

因此标准答案(--video-solution--: 3)指向选项 3。这道题表面只考一个连接词,实际检验的是学习者对 C# 循环文法细节的记忆精度——多语言开发者尤其容易把 JavaScript 的 for...of、Java 的 for (int v : values) 等习惯混入 C# 代码。

学以致用:把数组、foreach 与判断结构组合起来

掌握了语法之后,可以将本挑战的知识与同板块前一道挑战(if / else if / else 分支,见 647e21ba8acb466c97ccbee6.md)融合,模拟后续 Guided / Challenge Project 的真实任务形态:遍历分数数组,按区间输出评级。

int[] scores = { 55, 82, 96, 70, 43 };

foreach (int score in scores)
{
    if (score >= 90)
    {
        Console.WriteLine($"{score}: A");
    }
    else if (score >= 80)
    {
        Console.WriteLine($"{score}: B");
    }
    else if (score >= 70)
    {
        Console.WriteLine($"{score}: C");
    }
    else if (score >= 60)
    {
        Console.WriteLine($"{score}: D");
    }
    else
    {
        Console.WriteLine($"{score}: F");
    }
}

值得注意:此处的 foreach 只读取元素做判断,并未修改数组,因此用 foreach 是恰当的选择;if-else if 链自上而下匹配,保证每个分数只命中一个分支。

板块内另两道挑战还通过测验印证了「理解 foreach 自动化边界」这一要点:在 Guided Project 挑战 647e21eb8acb466c97ccbeea.md 中,题目描述一个 foreach 循环遍历含 20 个元素的数组,数组扩展到 40 个元素后要求程序仍能检查全部元素——正确答案是无需对 foreach 循环做任何修改,因为遍历范围由集合自身决定而非硬编码;而 Challenge Project 挑战 647e21d08acb466c97ccbee8.md 则考察多人协作时代码注释的合理用法(宜用块注释概括整体改动,而不是为每个改动做零碎标注)。这些知识点共同构成本板块「数组遍历 + 分支 + 可读性」的完整能力闭环。

通关与认证衔接指南

若你正在 freeCodeCamp 上挑战该认证,完整的衔接路径如下:

  1. 依次完成本板块 7 道学习与项目挑战(含本文所讲的数组/foreach 模块);
  2. 到 Microsoft Learn 个人成就页确认已获得 Create and Run Simple C# Console Applications 奖杯;
  3. 返回平台,在奖杯挑战 647f87dc07d29547b3bee1bf.md 中把 Microsoft 用户名与 freeCodeCamp 账号关联,点击 Verify Trophy 完成验证——该奖杯是参加认证考试的硬性前置条件;
  4. 依次完成超板块其余板块后,参加 Foundational C# with Microsoft 认证 对应的结业考试。

本文挑战只是中间一站,但它所奠基的「数组即有序集合、foreach 即只读遍历、in 才是合法连接词」三组核心概念,将贯穿之后的分支逻辑、变量数据操作、方法封装乃至最终的项目实践,是 C# 入门路径中性价比极高的一课。

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

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
858
1.35 K
docsdocs
暂无描述
Markdown
899
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
923
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.83 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
532
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
524
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
393