本介绍性教程介绍 C# 语言和类的 System.Collections.Generic.List<T> 基础知识。
本教程介绍 C# 。 编写 C# 代码并查看编译和运行该代码的结果。 它包含创建、修改和浏览集合的一系列课程。 你主要处理该 List<T> 类(class)。
在本教程中,你将:
- 使用 C# 开发环境启动 GitHub Codespace。
- 创建不同类型的列表。
- 修改列表内容。
- 搜索和排序列表。
先决条件
您必须拥有以下之一:
- 使用 GitHub Codespaces 需要一个 GitHub 帐户。 如果还没有帐户,可以在 GitHub.com 创建免费帐户。
- 安装了以下工具的计算机:
基本列表示例
若要使用教程环境启动 GitHub Codespace,请打开 教程 codespace 存储库的浏览器窗口。 选择绿色 “代码 ”按钮和 “代码空间 ”选项卡。然后选择该 + 符号以使用此环境创建新的 Codespace。 如果已完成本系列中的其他教程,则可以打开该代码空间,而不是创建新的代码空间。
在代码空间加载时,在名为 lists.cs 的教程文件夹中创建新文件。
打开新文件。
键入或将以下代码复制到 lists.cs:
List<string> names = ["<name>", "Ana", "Felipe"]; foreach (var name in names) { Console.WriteLine($"Hello {name.ToUpper()}!"); }通过在终端窗口中键入以下命令来运行代码:
cd tutorials dotnet lists.cs
你创建了一个字符串列表,向该列表添加了三个名称,并打印了所有大写的名称。 循环读取整个列表需要用到在前面的教程中学到的概念。
用于显示名称的代码使用 字符串内插 功能。 当在string前加上$字符时,可以在字符串声明中嵌入 C# 代码。 实际字符串将 C# 代码替换为它生成的值。 在此示例中,{name.ToUpper()} 被替换为各个转换为大写字母的名称,因为调用了 String.ToUpper 方法。
让我们继续探索。
修改列表内容
创建的集合使用 List<T> 类型。 此类型存储元素序列。 指定尖括号之间的元素的类型。
此 List<T> 类型的一个重要方面是它可以增长或收缩,使你能够添加或删除元素。 在显示其内容后,通过修改内容,可以查看结果。
在你已编写的代码(打印内容的循环)之后添加以下代码:
Console.WriteLine(); names.Add("Maria"); names.Add("Bill"); names.Remove("Ana"); foreach (var name in names) { Console.WriteLine($"Hello {name.ToUpper()}!"); }你向列表末尾添加了两个名称。 同时,也删除了一个名称。 此代码块的输出显示初始内容,然后输出空白行和新内容。
通过 List<T>,您还可以按 索引引用各个项。 使用
[和]令牌访问这些项。 在已编写代码后添加以下代码,然后尝试:Console.WriteLine($"My name is {names[0]}."); Console.WriteLine($"I've added {names[2]} and {names[3]} to the list.");不得访问超出列表末尾的项。 可以使用属性 Count 检查列表的时长。
添加以下代码:
Console.WriteLine($"The list has {names.Count} people in it");在终端窗口中再次键入
dotnet lists.cs以查看结果。 在 C# 中,索引从 0 开始,因此最大有效索引小于列表中的项数。
有关索引的详细信息,请参阅 “浏览索引和范围 ”一文。
搜索列表并进行排序
我们的示例使用相对较小的列表,但应用程序通常会创建包含更多元素的列表,有时以数千个元素进行编号。 若要查找这些较大的集合中的元素,需要搜索列表以查找不同的项。 该方法 IndexOf 搜索项并返回项的索引。 如果该项不在列表中,IndexOf 返回-1。
尝试查看其工作原理。 在到目前为止编写的代码后面添加以下代码:
var index = names.IndexOf("Felipe"); if (index == -1) { Console.WriteLine($"When an item is not found, IndexOf returns {index}"); } else { Console.WriteLine($"The name {names[index]} is at index {index}"); } index = names.IndexOf("Not Found"); if (index == -1) { Console.WriteLine($"When an item is not found, IndexOf returns {index}"); } else { Console.WriteLine($"The name {names[index]} is at index {index}"); }你可能不知道某个项是否在列表中,因此应始终检查返回的 IndexOf索引。
-1如果是,则找不到该项。还可以对列表中的项进行排序。 该方法 Sort 按常规顺序对列表中的所有项进行排序(按字母顺序排列)。。 添加此代码并再次运行:
names.Sort(); foreach (var name in names) { Console.WriteLine($"Hello {name.ToUpper()}!"); }
其他类型的列表
到目前为止,你在列表中一直使用 string 类型。 接下来,将让 List<T> 使用其他类型。 让我们生成一组数字。
在源文件末尾添加以下代码:
List<int> fibonacciNumbers = [1, 1];该代码创建整数列表,并将前两个整数设置为值 1。 Fibonacci 序列,一个数字序列,以两个 1' 开头。 接下来的每一个菲博纳奇数都是通过获取前两个数字的总和找到的。
添加以下代码:
var previous = fibonacciNumbers[fibonacciNumbers.Count - 1]; var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2]; fibonacciNumbers.Add(previous + previous2); foreach (var item in fibonacciNumbers) { Console.WriteLine(item); }在终端窗口中键入
dotnet lists.cs以查看结果。
挑战
看看你能否从本课和早期课程中总结出一些概念。 扩展你迄今为止使用菲博纳奇数字构建的内容。 尝试编写代码以生成序列中的前 20 个数字。 (作为提示,第20个菲博纳奇数字是6765。
你想到这样的东西吗?
List<int> fibonacciNumbers = [1, 1];
while (fibonacciNumbers.Count < 20)
{
var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
fibonacciNumbers.Add(previous + previous2);
}
foreach (var item in fibonacciNumbers)
{
Console.WriteLine(item);
}
每次循环迭代时,你将获取列表中的最后两个整数,对它们求和,并将该值添加到列表中。 循环重复,直到向列表添加 20 个项目。
已完成列表教程。 可以在以下文章中了解有关 .NET 集合 的详细信息:
清理资源
GitHub 会在 30 天不活动后自动删除 Codespace。 如果打算探索本系列中的更多教程,您可以保留 Codespace 配置。 如果已准备好访问 .NET 站点 来下载 .NET SDK,则可以删除 Codespace。 若要删除 Codespace,请打开浏览器窗口并导航到 Codespaces。 应该会在窗口中看到代码空间的列表。 在学习教程代码空间的条目中选择三个点(...),然后选择 “删除”。