教程:了解如何使用 C 中的列表<T> 管理数据收集#

本介绍性教程介绍 C# 语言和类的 System.Collections.Generic.List<T> 基础知识。

本教程介绍 C# 。 编写 C# 代码并查看编译和运行该代码的结果。 它包含创建、修改和浏览集合的一系列课程。 你主要处理该 List<T> 类(class)。

在本教程中,你将:

  • 使用 C# 开发环境启动 GitHub Codespace。
  • 创建不同类型的列表。
  • 修改列表内容。
  • 搜索和排序列表。

先决条件

您必须拥有以下之一:

基本列表示例

若要使用教程环境启动 GitHub Codespace,请打开 教程 codespace 存储库的浏览器窗口。 选择绿色 “代码 ”按钮和 “代码空间 ”选项卡。然后选择该 + 符号以使用此环境创建新的 Codespace。 如果已完成本系列中的其他教程,则可以打开该代码空间,而不是创建新的代码空间。

  1. 在代码空间加载时,在名为 lists.cs教程文件夹中创建新文件。

  2. 打开新文件。

  3. 键入或将以下代码复制到 lists.cs

    List<string> names = ["<name>", "Ana", "Felipe"];
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
    
  4. 通过在终端窗口中键入以下命令来运行代码:

    cd tutorials
    dotnet lists.cs
    

你创建了一个字符串列表,向该列表添加了三个名称,并打印了所有大写的名称。 循环读取整个列表需要用到在前面的教程中学到的概念。

用于显示名称的代码使用 字符串内插 功能。 当在string前加上$字符时,可以在字符串声明中嵌入 C# 代码。 实际字符串将 C# 代码替换为它生成的值。 在此示例中,{name.ToUpper()} 被替换为各个转换为大写字母的名称,因为调用了 String.ToUpper 方法。

让我们继续探索。

修改列表内容

创建的集合使用 List<T> 类型。 此类型存储元素序列。 指定尖括号之间的元素的类型。

List<T> 类型的一个重要方面是它可以增长或收缩,使你能够添加或删除元素。 在显示其内容后,通过修改内容,可以查看结果。

  1. 在你已编写的代码(打印内容的循环)之后添加以下代码:

    Console.WriteLine();
    names.Add("Maria");
    names.Add("Bill");
    names.Remove("Ana");
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
    

    你向列表末尾添加了两个名称。 同时,也删除了一个名称。 此代码块的输出显示初始内容,然后输出空白行和新内容。

  2. 通过 List<T>,您还可以按 索引引用各个项。 使用 [] 令牌访问这些项。 在已编写代码后添加以下代码,然后尝试:

    Console.WriteLine($"My name is {names[0]}.");
    Console.WriteLine($"I've added {names[2]} and {names[3]} to the list.");
    

    不得访问超出列表末尾的项。 可以使用属性 Count 检查列表的时长。

  3. 添加以下代码:

    Console.WriteLine($"The list has {names.Count} people in it");
    

    在终端窗口中再次键入 dotnet lists.cs 以查看结果。 在 C# 中,索引从 0 开始,因此最大有效索引小于列表中的项数。

有关索引的详细信息,请参阅 “浏览索引和范围 ”一文。

搜索列表并进行排序

我们的示例使用相对较小的列表,但应用程序通常会创建包含更多元素的列表,有时以数千个元素进行编号。 若要查找这些较大的集合中的元素,需要搜索列表以查找不同的项。 该方法 IndexOf 搜索项并返回项的索引。 如果该项不在列表中,IndexOf 返回-1

  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如果是,则找不到该项。

  2. 还可以对列表中的项进行排序。 该方法 Sort 按常规顺序对列表中的所有项进行排序(按字母顺序排列)。。 添加此代码并再次运行:

    names.Sort();
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
    

其他类型的列表

到目前为止,你在列表中一直使用 string 类型。 接下来,将让 List<T> 使用其他类型。 让我们生成一组数字。

  1. 在源文件末尾添加以下代码:

    List<int> fibonacciNumbers = [1, 1];
    

    该代码创建整数列表,并将前两个整数设置为值 1。 Fibonacci 序列,一个数字序列,以两个 1' 开头。 接下来的每一个菲博纳奇数都是通过获取前两个数字的总和找到的。

  2. 添加以下代码:

    var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
    var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
    
    fibonacciNumbers.Add(previous + previous2);
    
    foreach (var item in fibonacciNumbers)
    {
        Console.WriteLine(item);
    }
    
  3. 在终端窗口中键入 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。 应该会在窗口中看到代码空间的列表。 在学习教程代码空间的条目中选择三个点(...),然后选择 “删除”。

后续步骤