了解 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 使用集合初始化语法创建了 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 方法、谓词函数等等,以增强您对列表的理解和有效操作列表的能力。



