在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/