📅  最后修改于: 2023-12-03 14:59:40.071000             🧑  作者: Mango
C# 中的 foreach 循环是一种用于遍历集合元素的简洁、易于使用的语句。对于字典类型,我们可以使用 foreach 循环遍历其中的键值对。本文将重点介绍如何使用 foreach 循环遍历字典类型及其相关注意事项。
以一般的 foreach 循环语句遍历字典类型时,其实是遍历了字典类型的所有键。如果我们需要遍历字典的键值对,则需要使用 KeyValuePair<TKey, TValue> 对象,如下所示:
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("one", 1);
dict.Add("two", 2);
dict.Add("three", 3);
foreach (KeyValuePair<string, int> kvp in dict)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
上述代码输出:
Key = one, Value = 1
Key = two, Value = 2
Key = three, Value = 3
需要注意的是,KeyValuePair<TKey, TValue> 对象实际上是一个结构体,因此在遍历时会复制一份,而不是直接使用引用。
从字典类型的实现原理可以看出,遍历字典中的键值对不一定会按照添加的顺序进行。由于字典内部是通过哈希算法实现的快速查找,因此键值对的存储顺序是无序的。如果需要有序输出,则需要对字典中的键值对进行排序,然后再遍历。
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("one", 1);
dict.Add("three", 3);
dict.Add("two", 2);
var list = dict.ToList();
list.Sort((pair1, pair2) => pair1.Key.CompareTo(pair2.Key));
foreach (var kvp in list)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
上述代码输出:
Key = one, Value = 1
Key = three, Value = 3
Key = two, Value = 2
在使用 foreach 循环遍历字典时,如果字典对象在遍历过程中被修改了,就会抛出异常。因此,我们在遍历字典时应当避免对其进行修改。
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("one", 1);
dict.Add("two", 2);
dict.Add("three", 3);
foreach (KeyValuePair<string, int> kvp in dict)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
if (kvp.Key == "two")
{
dict.Remove(kvp.Key);
}
}
上述代码会抛出异常:
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
因此,需要在修改字典时使用其他方法,例如在循环外保存需要从字典中删除的键,循环结束后再进行删除操作。
foreach 循环是 C# 中遍历集合类型的常用方法,对于字典类型也非常实用。需要注意的是,在遍历字典时,需要使用 KeyValuePair<TKey, TValue> 对象,并且不能在遍历过程中修改字典对象。