跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

了解 C# 列表

Layla Porter
14m 6s

C# 中的 List 类是一种用途广泛的集合类型。 它以动态数组作为其内部数据结构,从而可以高效地操作元素。 创建列表时,您可以指定默认初始容量,以便从一开始就优化内存使用。 该容量是指列表在不重新分配内存的情况下,初始状态下可以容纳的元素数量。

在 Layla Porter 的视频" C# 入门教程 第 7 部分 - 使用 LINQ 查询数据"中,她深入探讨了 C# 列表的功能,演示了如何利用 LINQ(语言集成查询)高效地查询数据。 本文将 Layla 视频中的关键概念和示例进行分解,为初学者提供对 C# 列表的全面理解。

C# 列表简介

正如莱拉在视频开头(0:03)提到的那样,C# 列表是一种用途广泛的数据结构,允许开发人员存储和操作元素集合。 与数组不同,列表可以动态调整大小,因此非常适合预先不知道元素数量的场景。

使用列表非常简单。 您可以使用 Add 方法向列表中添加元素,该方法会将指定的对象追加到列表末尾。该列表使用从零开始的索引,这意味着第一个元素位于索引 0 处。您还可以使用方括号 ([]) 通过指定的索引访问元素。

要遍历列表,可以使用 foreach 循环,它会按元素出现的顺序遍历每个元素。 如果您需要查找特定元素的首次出现,可以使用带有谓词的 IndexOf 等方法,该方法会根据指定的条件进行搜索。

列表是强类型的,这意味着它可以保存特定类型(T)的对象。 这样可以确保类型安全,并允许使用由指定对象类型定义的方法和属性。 默认情况下,List 使用默认的哈希函数来高效地组织元素。

让我们深入了解一下 List 和 List 类方法的工作原理,就像 Layla 在她的视频中演示的那样。

创建列表

在 C# 中创建列表时,可以设置指定的初始容量来优化内部数据结构。 列表用途广泛,可以从指定的元素集合进行初始化。 您可以使用整数索引访问元素,并使用 foreach 循环遍历它们。与字典不同,列表不依赖默认的哈希函数,并且它们存储强类型对象,从而确保数据管理中的类型安全性和一致性。

在 (0:44) 处,Layla 创建了一个奶酪列表,演示了如何初始化和填充列表。在 C# 中,可以使用 List 类创建列表,其中 T 表示列表中元素的类型。

List<Cheese> cheeseList = new List<Cheese>
{
    new Cheese(1, "Stilton", 3.0m, 5),
    new Cheese(2, "Cheddar", 2.25m, 3),
    new Cheese(3, "Pineapple", 3.5m, 1),
    new Cheese(4, "Brie", 5.5m, 2),
    new Cheese(5, "Roquefort", 3.5m, 5),
};
List<Cheese> cheeseList = new List<Cheese>
{
    new Cheese(1, "Stilton", 3.0m, 5),
    new Cheese(2, "Cheddar", 2.25m, 3),
    new Cheese(3, "Pineapple", 3.5m, 1),
    new Cheese(4, "Brie", 5.5m, 2),
    new Cheese(5, "Roquefort", 3.5m, 5),
};

在上述示例中,Layla 使用集合初始化语法创建了一个Cheese对象的列表。 她为与 Cheese 类对应的每个奶酪对象指定了 ID、名称、价格和强度等属性,演示了如何在 C# 中创建和初始化列表。

遍历奶酪清单,打印 ID 和名称

Layla Porter 演示了如何使用 foreach 循环来遍历cheeseList,并仅打印每种奶酪的 ID 和名称。 以下是代码及解释:

foreach (var cheese in cheeseList)
{
    Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}
foreach (var cheese in cheeseList)
{
    Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}

在上述代码中,Layla 使用了 foreach 循环遍历cheeseList。 这会打印出列表中的所有元素。循环遍历列表中的每个 Cheese 对象。在每次迭代中,变量cheese保存当前索引处的 Cheese 对象。 使用Console.WriteLine,她打印出每个奶酪元素的 ID 和名称属性,展示了如何在 C# 中访问和显示列表中的特定元素。

使用 LINQ 查询搜索奶酪

在视频 2:45 处,Layla Porter 演示了如何使用 LINQ 根据用户输入搜索特定的奶酪。 她使用ReadLine方法从用户处获取奶酪名称:

string cheeseName = Console.ReadLine();
string cheeseName = Console.ReadLine();

在列表中搜索项目时,Layla 在 2:51 强调了一个非常重要的关键点。她说,如果我们不使用 LINQ,我们就必须手动遍历集合中的每一种奶酪,才能找到与用户输入匹配的名称,但 LINQ 的辅助库会在后台处理这些操作,使整个过程非常高效。 以下代码片段演示了 Layla (3:40) 如何仅使用 LINQ 查询语法,而无需使用 for 循环来遍历列表元素:

if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
    Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);

    Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
    Console.WriteLine("I'm sorry, we don't have that cheese.");
}
if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
    Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);

    Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
    Console.WriteLine("I'm sorry, we don't have that cheese.");
}

在上述代码中

  • Layla 解释说,与其手动遍历列表,不如使用 LINQ 进行更高效的搜索。 Any方法检查列表中是否有奶酪与用户输入的名称匹配。

  • 如果找到匹配,则说明元素存在,FirstOrDefault方法检索与输入名称匹配的第一个奶酪。 该方法很安全,因为如果没有找到匹配项,它会返回 null,从而防止潜在的错误。

  • 如果找到奶酪,则打印其名称、价格和强度。 否则,将显示一条消息,表明未找到奶酪。

这种方法展现了在 C# 中使用 LINQ 搜索集合的效率和简易性。 代码片段的输出结果显示在 7:19:(是否有比下图更好的图片?)

示例输出

搜索时处理大小写敏感性

在处理字符串时,Layla 在 8:00 提醒记住它们是区分大小写的。为了确保我们的奶酪名称比较不区分大小写,我们需要使用.ToLower()方法将用户的输入和列表中的奶酪名称都转换为小写。 这样一来,用户可以输入任何类型的字母大小写,我们的代码仍然能够正确找到匹配的奶酪。 请记住,字符串区分大小写可能会很麻烦,因此正确处理至关重要。

实际示例:按强度查询奶酪

在 (8:50) 处,Layla 创建了一个实际示例,用户可以按强度筛选奶酪,演示了如何将用户输入与 LINQ 查询结合起来。

1. 用户输入提示和读取

Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();
Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();

Layla 在 9:05 开始时,让用户选择一个介于 1 到 5 的强度值。这是通过简单的Console.ReadLine()来获取他们输入的内容。

2. 将输入转换为整数

bool isInt = int.TryParse(strengthString, out int strength);
bool isInt = int.TryParse(strengthString, out int strength);

接下来,在 9:16,她确认他们输入的是一个实际的数字。 她建议为此使用int.TryParse。 如果输入正确且成功转换为整数,那就太好了! 如果不行,那我们也能妥善处理。

3. 按强度过滤奶酪

List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();
List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();

Layla 的视频在 10:25 进入了有趣的部分。这里,她展示了如何使用 LINQ 来筛选我们的奶酪列表,即cheeseList。 使用 LINQ 的Where方法和一个快速的 lambda 表达式(c => c.Strength == strength),她只提取出与用户选择的强度匹配的奶酪。 这给我们一个新的列表,cheeseByStrength

4. 出货过滤奶酪

foreach (var cheese in cheeseByStrength)
{
    Console.WriteLine($"Name: {cheese.Name} cheese");
}
foreach (var cheese in cheeseByStrength)
{
    Console.WriteLine($"Name: {cheese.Name} cheese");
}

最后在 12:03,Layla 用 foreach 循环遍历Console.WriteLine指定的谓词打印出其名称。 简单有效!

在 12:17 执行程序时,Layla 演示了用户如何输入强度值,列表将被筛选,只显示具有指定强度的奶酪。 示例输出如下所示:(能否提供更清晰的图像?)

示例输出

结论

Layla 的视频有效地介绍了 C# 列表的概念以及如何使用 LINQ 查询列表。 通过学习她的例子和解释,初学者可以掌握在 C# 中处理列表和查询数据的扎实基础。 欲了解更多详情和观看实时编程课程,请查看 Layla 的 YouTube频道并加入她的直播。

请记得探索 List 类的各种方法和属性,例如Insert方法、谓词函数等,以提高您对列表的理解和有效操作列表的能力。

Hero Worlddot related to 了解 C# 列表
Hero Affiliate related to 了解 C# 列表

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我