了解 C# 列表
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方法、谓词函数等,以提高您对列表的理解和有效操作列表的能力。



