C# 字典迭代:初学者与专家的完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# 中的字典:为什么重要以及如何使用?



想象一下,你是一名图书管理员。你有成千上万本书,需要在几秒钟内找到特定的一本。你会一本一本地翻找吗?不,你会使用目录。C# 中的字典(Dictionary)就是这样一个目录。它存储"键-值"对,并允许你通过键立即获取数据。



但是,当你不需要查找单个条目,而是需要处理字典中的所有内容时该怎么办?例如,输出所有应用程序设置、计算在线购物车中的总金额,或将数据序列化为 JSON。这时就出现了一个经典问题:"How to iterate over a dictionary?"。



在 Stack Overflow 上,这个问题获得了数千次浏览。这并不奇怪:看起来很简单,对吧?但初学者经常在数据类型上犯错,而专业人士则关注性能。在本文中,我们将介绍 C# 中字典迭代的所有方法:从简单的 foreach 到高级的 LINQ。开始吧!



1. 基础:C# 中的 Dictionary 结构



在开始迭代之前,让我们回顾一下C# 字典的样子。它是来自 System.Collections.Generic 命名空间的泛型集合。



Dictionary<string, int> ages = new Dictionary<string, int>(){    { "安娜", 25 },    { "鲍里斯", 30 },    { "维克多", 35 }};


字典中的每个元素都是一个 KeyValuePair<TKey, TValue> 结构。它有两个属性:Key 和 Value。我们在遍历时就是处理这个键值对。



2. 经典方法:使用 foreach 遍历字典



最常见的C# 字典迭代方法是使用 foreach 循环。它简洁、易读且安全。



foreach (KeyValuePair<string, int> kvp in ages){    Console.WriteLine($"{kvp.Key}: {kvp.Value} 岁");}


输出:

安娜: 25 岁鲍里斯: 30 岁维克多: 35 岁


请注意:kvp 是一个KeyValuePair。不要在循环内尝试修改键或值——字典会变得不一致,并且你会收到 InvalidOperationException 异常。



专业人士的建议:如果不想写完整的类型,可以使用 var:

foreach (var kvp in ages) { ... }


3. 仅遍历键或仅遍历值



有时我们不需要整个键值对。例如,只需要输出所有键(姓名)或所有值(年龄)的列表。为此,字典提供了 Keys 和 Values 属性。



遍历键

foreach (string name in ages.Keys){    Console.WriteLine($"姓名: {name}");}


遍历值

foreach (int age in ages.Values){    Console.WriteLine($"年龄: {age}");}


如果你不需要另一半部分,这比获取 KeyValuePair 更快。而且代码也更简洁。



4. 索引访问:for 和 ElementAt



许多初学者尝试使用 for (int i = 0; i < dict.Count; i++)。但C# 中的 Dictionary 不支持按数字索引!尝试写 dict[i] 会导致编译错误。



不过,你可以变通一下:通过 .ToList() 获取键值对集合,然后按索引访问。



var list = ages.ToList();for (int i = 0; i < list.Count; i++){    Console.WriteLine($"{list[i].Key}: {list[i].Value}");}


缺点:

  • 会创建额外的数据副本(消耗内存和时间)。
  • 失去了字典作为关联数组的意义。

只有在确实需要索引时才使用此方法(例如,用于分块并行处理)。



5.

博客

书籍推荐