C#中的字典枚举

如何枚举字典?

假设我使用foreach()进行dictionay枚举。 我无法更新foreach()的键/值对。 所以我想要一些其他的方法。

要枚举字典,您要枚举其中的值:

 Dictionary dic; foreach(string s in dic.Values) { Console.WriteLine(s); } 

或KeyValuePairs

 foreach(KeyValuePair kvp in dic) { Console.WriteLine("Key : " + kvp.Key.ToString() + ", Value : " + kvp.Value); } 

或钥匙

 foreach(int key in dic.Keys) { Console.WriteLine(key.ToString()); } 

如果您希望更新字典中的项目,则需要稍微改变一下,因为在枚举时无法更新实例。 你需要做的是枚举一个没有更新的不同集合,如下所示:

 Dictionary newValues = new Dictionary() { 1, "Test" }; foreach(KeyValuePair kvp in newValues) { dic[kvp.Key] = kvp.Value; // will automatically add the item if it's not there } 

要删除项目,请以类似的方式执行此操作,枚举我们要删除的项目集合,而不是字典本身。

 List keys = new List() { 1, 3 }; foreach(int key in keys) { dic.Remove(key); } 

在回答问题“我无法更新foreach()中的值/键”时,您无法在枚举时修改集合。 我会通过制作Keys集合的副本来解决这个问题:

 Dictionary dic=new Dictionary(); //...fill the dictionary int[] keys = dic.Keys.ToArray(); foreach (int i in keys) { dic.Remove(i); } 

的foreach。 有三种方法:您可以枚举Keys属性, Values属性或字典本身,它是KeyValuePair的枚举器。

我刚刚回答了相同(更新)的列表问题,所以这里的字典也是一样的。

 public static void MutateEach(this IDictionary dict, Func> mutator) { var removals = new List(); var additions = new List>(); foreach (var pair in dict) { var newPair = mutator(pair.Key, pair.Value); if ((newPair.Key != pair.Key) || (newPair.Value != pair.Value)) { removals.Add(pair.Key); additions.Add(newPair); } } foreach (var removal in removals) dict.Remove(removal); foreach (var addition in additions) dict.Add(addition.Key, addition.Value); } 

请注意,我们必须在循环外进行更新,因此我们不会在枚举时修改字典。 此外,这还可以检测由于使两个键相同而引起的冲突 – 它将抛出(由于使用了Add )。

示例 – 使用Dictionary使所有键小写并修剪所有值:

 myDict.MutateEach(key => key.ToLower(), value => value.Trim()); 

如果键小写时不是唯一的,则会抛出。