跳至页脚内容
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 使用集合初始化语法创建了 List<Cheese>,以定义列表并填充 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.WriteLine 请求输入,然后通过 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();

现在到了莱拉视频的精彩部分,从 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 循环遍历 cheeseByStrength。对于该列表中的每种奶酪,她使用 Console.WriteLine 中指定的谓词打印出它的名称。 简单有效!

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

示例输出

结论

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

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

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

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

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

钢铁支援团队

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