了解 C# 数组
C# 中的数组是一种基本数据结构,它允许开发人员将相同类型的元素集合存储在连续的内存位置中。 数组可以是一维的、多维的,或者不规则的。
本文关于 C# 数组的内容灵感来源于 Layla Porter 的教学视频" C# 入门教程 第 5 部分 - 数组和更多循环"。在她的视频中,Layla 深入讲解了数组的基础知识,并介绍了 C# 中的更多循环技巧,使观众掌握管理集合和有效遍历数据的基本技能。
理解数组
Layla 首先解释了 C# 中的数组是固定长度的集合。 与其他一些编程语言中数组可以动态改变大小不同,C# 中的数组一旦创建就不可更改。 这意味着由于内存分配限制,初始化后它们的大小无法改变。
简单的控制台交互:选择你最喜欢的奶酪
在以下代码中,与数组不同,Layla (1:50) 首先演示了如何向用户呈现一个项目列表,供他们选择。
Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");此代码首先使用Console.WriteLine在控制台上打印一条消息,询问用户他们最喜欢的奶酪是什么。 然后它使用Console.WriteLine四次在控制台上打印奶酪列表。 接着,这段代码使用favouriteCheese中。 最后,代码再次使用Console.WriteLine在控制台上打印一条消息,其中包括用户最喜欢的奶酪。
Layla 在 2 分 04 秒处执行了这段代码,以演示其工作原理:

声明数组 - 数组初始化
为了说明这一点,Layla 首先演示了如何声明和初始化一个字符串数组,在本例中,这是一个最初作为菜单呈现给用户的奶酪列表。 她介绍了定义一维数组的语法(2:30)以及使用花括号填充初始值的语法(2:54)。
string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };她强调了数组中从零开始索引的重要性,即一维数组中的第一个元素通过索引 0 访问。随后,Layla 演示了如何使用 for 循环遍历数组。这种循环结构在编程中至关重要,因为它允许根据特定条件重复执行代码。
实现循环
接下来是循环,Layla 介绍了 for 循环及其三个基本组成部分:初始化器、条件和迭代器。 该循环用于根据数组的长度遍历数组元素。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}她在4:44强调,cheeses.Length提供了数组中元素的数量,确保循环精确地遍历每个元素。 变量i作为索引变量,用于遍历索引。 这有效地打印了单个数组元素,而无需多次编写Console.WriteLine方法,如上所示,同时未访问数组元素。 Layla 在 6:17 运行应用程序,显示此 for 循环的输出与前面的示例完全相同:

排序和可变性
Layla解释了排序的好处,然后在7:17,她演示了使用Sort方法按字母顺序排序数组,并警告说,由于C#中数组的不可变性,排序实际上在幕后创建了一个新数组。 这是理解数据操作如何影响内存和性能的关键所在。
Array.Sort(cheeses);Array.Sort(cheeses);她还展示了如何直接修改数组中的各个元素而无需创建新数组(8:10),从而在不可变性中体现了可变性。 要替换的元素的索引在方括号内传递在cheeses数组变量之后:
cheeses[0] = "Roquefort";cheeses[0] = "Roquefort";这将把数组中索引为 0 的元素"Brie"替换为新值"Roquefort"。
更新奶酪清单:处理新增条目(8:46)
Layla解释了如何向现有列表中添加值。这包括获取现有值和新值,创建一个包含这两个值的新数组,然后更新引用以指向这个新数组。 以下代码演示了它的工作原理:
var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}此示例以简便方式展示了使用基本数组操作和Append方法附加到数组中。
Layla在13:50表示代码出错,因为IEnumerable,这是一个用于集合的接口。 为了解决这个问题,我们使用cheeses。 Layla指出黄色波浪线是编译器警告,指示潜在问题,比如favouriteCheese为null,但在此演示中我们忽略了安全检查。
更新和打印奶酪清单
莱拉解释说,一旦我们向数组中添加了一个新项,就应该将更新后的列表打印到屏幕上。 为此,我们使用for循环,打印每个元素及其索引,以显示数组现在包含更多项目。
Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");这展示了 C# 中数组的动态特性,演示了如何添加新元素以及如何通过打印数组内容来验证更新。
然后莱拉运行应用程序来显示新添加的奶酪(15:19):

利用对象数组进行增强
为了扩大理解,Layla通过创建一个带有Cheese类介绍对象数组 (16:14)。 然后她替换字符串列表以创建Cheese对象的数组,并演示如何在迭代过程中访问对象内的属性 (17:46)。
class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);本部分将介绍数组如何封装复杂的数据结构,从而为编程提供灵活性和强大的功能。
在循环中使用奶酪对象
Layla 现在演示如何将更新后的列表的所有元素打印到屏幕上。 在此场景中,每个奶酪表示为一个具有Strength属性的对象。 Cheese对象的数组,其中每次迭代直接处理一个数组元素。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}此循环简化了对存储在Cheese对象属性的访问。 莱拉于20:34运行了该程序,输出结果如下:

结论
总之, Layla Porter 的C# 数组和循环教程为初学者理解这些基本概念奠定了坚实的基础。通过掌握数组和各种循环结构,有志成为 C# 开发人员的人可以有效地操作数据结构,并在程序中遍历集合。 理解这些基本原理对于构建更复杂的应用程序和探索 C# 编程的更多方面至关重要。
通过学习 Layla 的示例和解释,初学者可以更有信心在自己的 C# 项目中有效地使用数组和循环。 对于 C# 集合以及高级二维数组和锯齿数组的更深入讲解,我们鼓励学习者探索后续教程和实践练习。




