遍历字典

5

我有一个包含“人”和“计数”值的字典:

Dictionary<string, int> PersonDictionary = new Dictionary<string, int>();

它具有以下数值:
Sally, 6
Beth, 5
Mary, 5

我想要交替每个人,并在每次循环时将值减1。我在这个问题上遇到了真正的心理障碍。
最好的方法是获取Sally并将其减1,然后转到Beth并将其减1,然后转到Mary并将其减1,然后回到Sally...以此类推。
只需进一步澄清,我想循环遍历它,并使用owner.Key值将其传递给另一个方法。因此,我需要能够逐个遍历此字典。
更新:
我的问题有几个问题。一个问题是在循环中递减字典。但我的主要问题是如何迭代每个项目(Sally-> Beth-> Mary-> Sally),直到每个人的价值降为0-这部分仍然是大问题。

我在这里有点不明白。你为什么要用if和else?字典有唯一的键,所以没有必要检查重复项。只需要 PersonDictionary[owner.Key] = owner.Value - 1; 就可以了。 - aquinas
也许你可以澄清一下:“因为它按顺序执行。”第一个“它”和第二个“它”分别指的是什么,你所提到的顺序是指什么? - aquinas
@aquinas 执行 foreach (var owner in personDictionary) personDictionary[owner.Key] = owner.Value - 1; 将会导致 InvalidOperationException 异常,因为在字典中设置一个值会更新其内部版本号,从而使迭代器无效。 - Ousmane D.
@Aominè,说得好,但只需添加 ToList 即可解决问题。看起来可能还有其他问题,但也许并没有。OP 似乎已经消失了,所以我们可能永远不会知道 :) - aquinas
定义:不工作。 - Patrick Hofman
显示剩余3条评论
2个回答

6
使用Linq,代码如下:
personDictionary = personDictionary.ToDictionary(e => e.Key, e => e.Value-1);

2
值得一提的是,这将创建一个 Dictionary副本,这可能是一个不需要的效果。 - Fabjan

5
上述方法是不可行的。
这是因为无法在foreach循环中同时修改集合并遍历它。
所以当我们循环遍历字典并尝试修改它时会抛出异常。
为了更改相同的值而不创建副本,我们可以遍历Keys集合的副本,并使用索引器。
foreach (var ownerKey in PersonDictionary.Keys.ToList())
{
    PersonDictionary[ownerKey]--;
}

这将复制 Keys,但是 Dictionary 对象本身和 Values 集合将保持不变。 或者,如果复制整个字典不是问题,您可以使用 Aominè 的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接