C#中的字典枚举

时间:2009-03-24 10:48:28

标签: c# .net dictionary enumeration

如何枚举字典?

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

4 个答案:

答案 0 :(得分:78)

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

Dictionary<int, string> dic;

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

或KeyValuePairs

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

或键

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

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

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

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

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

答案 1 :(得分:9)

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

Dictionary<int,int> dic=new Dictionary<int, int>();

//...fill the dictionary

int[] keys = dic.Keys.ToArray();
foreach (int i in keys)
{
    dic.Remove(i);
}

答案 2 :(得分:8)

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

答案 3 :(得分:2)

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

public static void MutateEach(this IDictionary<TKey, TValue> dict, Func<TKey, TValue, KeyValuePair<TKey, TValue>> mutator)
{
    var removals = new List<TKey>();
    var additions = new List<KeyValuePair<TKey, TValue>>();

    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<string, string>

使所有键小写并修剪所有值
myDict.MutateEach(key => key.ToLower(), value => value.Trim());

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