📜  c# foreach 字典 - C# (1)

📅  最后修改于: 2023-12-03 14:59:40.071000             🧑  作者: Mango

C# foreach 字典

介绍

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> 对象,并且不能在遍历过程中修改字典对象。