在C#Dictionary 中设置所有值的最佳方法是什么?

在C#字典中设置所有值的最佳方法是什么?

这是我现在正在做的,但我确信有更好/更清洁的方法来做到这一点:

Dictionary dict = GetDictionary(); var keys = dict.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { dict[keys[i]] = false; } 

我已经尝试过foreach的其他方法,但我有错误。

这是一种合理的方法,但我更愿意:

 foreach (var key in dict.Keys.ToList()) { dict[key] = false; } 

ToList()的调用使这个工作,因为它正在拉出并(暂时)保存键列表,因此迭代工作。

一线解决方案:

 dict = dict.ToDictionary(p => p.Key, p => false); 

如果您不使用三态bool,则可以使用HashSet ,并调用Clear()将值设置为“false”。

我不确定这是不是最好的方式,但我在一条线上找东西,这对我有用

 mydict.Keys.ToList().ForEach(k => mydict[k] = false); 

我概述了比利和里德的解决方案之间的区别。 Polaris878,记下结果,记住过早优化是万恶之源;-)

我在VB中重写了解决方案(因为我目前正在使用该语言进行编程)并使用了int键(为简单起见),否则它就是完全相同的代码。 我使用一个包含1000万个条目的字典运行代码,每个条目的值为“true”。

Billy Witch Doctor的原始解决方案:

 Dim keys = dict.Keys.ToList For i = 0 To keys.Count - 1 dict(keys(i)) = False Next 

经过的毫秒数:415

Reed Copsey的解决方案:

 For Each key In dict.Keys.ToList dict(key) = False Next 

经过的毫秒数:395

所以在这种情况下,foreach实际上更快

你可以拔出ToList()并直接遍历字典项

 Dictionary dict = GetDictionary(); foreach (var pair in dict) { dict[pair.Key] = false; } 

按照你现在的方式做到这一点…… foreach很慢。 foreach可能更干净,但是使用它会带来太多的性能损失。

编辑:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/