Loop through Dictionary
我有一本字典,上面有一个人和一个数值:
1
| Dictionary <string, int> PersonDictionary = new Dictionary <string, int>(); |
它具有以下值:
1 2 3
| Sally, 6
Beth, 5
Mary, 5 |
号
我想替换每个人,每次循环时将值递减1。我在这件事上遇到了一个真正的思维障碍
有什么办法能使萨利降一级,然后到贝丝降一级,然后到玛丽降一级,然后再回到萨利……等等。
只需添加进一步的说明,我想循环使用这个并使用owner.Key值,然后将其传递给另一个方法。所以我需要能够一次遍历这本字典1。
更新:
我的问题有几个问题。一个问题是在循环中对字典进行递减。但我的主要问题是如何遍历每个项目[Sally -> Beth -> Mary -> Sally],直到每个人的值变为0-这部分仍然是个大问题。
- 我这里有些东西不见了。你为什么有if和else?字典有唯一的键,因此没有理由检查重复项。只是PersonDictionary[owner.Key] = owner.Value - 1;应该工作得很好。
- 也许你可以澄清这一点:"因为它是按顺序进行的。"第一个"它"是什么,第二个"它"是什么?你指的是什么顺序?
- @执行foreach (var owner in personDictionary) personDictionary[owner.Key] = owner.Value - 1; 的aquinas将生成InvalidOperationException,因为在字典中设置值会更新其内部版本号,从而使迭代器失效。
- @Aomin&232;,公平点,但是添加ToList可以解决这个问题。似乎还有别的事情发生,但也许没有。行动似乎消失了,所以我们可能永远也不知道:)
- 定义:不起作用。
- @帕特里克霍夫曼-我真的想知道如何在这本字典中迭代每个人,每次递减1。先是莎莉,然后是贝丝,然后是玛丽,然后回到莎莉身边。我截取的代码不起作用,因为我遗漏了如何按名称浏览每个项目,直到没有更多的值。
- 一个while循环……
- @帕特里克霍夫曼-谢谢,这应该管用。
使用LINQ,如下所示:
1
| personDictionary = personDictionary.ToDictionary(e => e.Key, e => e.Value-1); |
- 值得一提的是,这将创建一个Dictionary的副本,这可能是或可能不是一个不必要的影响。
The above DOESN'T work.
号
它不起作用,因为不可能修改foreach循环内部的集合并同时对其进行迭代。
这就是为什么当我们遍历字典并尝试修改它时,会抛出一个异常。
为了更改相同的值而不创建它们的副本,我们可以遍历Keys集合的副本并使用索引器:
1 2 3 4
| foreach (var ownerKey in PersonDictionary.Keys.ToList())
{
PersonDictionary[ownerKey]--;
} |
号
这将复制Keys,但Dictionary对象本身和Values集合将保持不变。或者,如果制作整个词典的副本不是一个问题,您可以使用Aominè的解决方案。