在C#字典中设置所有值的最佳方法是什么?
以下是我现在正在做的事情,但我确信有更好/更清洁的方法可以做到这一点:
Dictionary<string,bool> dict = GetDictionary();
var keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
dict[keys[i]] = false;
}
我已尝试过foreach的其他方法,但我有错误。
答案 0 :(得分:69)
这是一种合理的方法,但我更愿意:
foreach (var key in dict.Keys.ToList())
{
dict[key] = false;
}
对ToList()
的调用使这项工作成功,因为它正在拉出并(暂时)保存密钥列表,因此迭代可以正常工作。
答案 1 :(得分:24)
单线解决方案:
dict = dict.ToDictionary(p => p.Key, p => false);
答案 2 :(得分:6)
如果您没有使用三态布尔,那么您可以使用HashSet<string>
,并致电Clear()
将值设置为“false”。
答案 3 :(得分:3)
我不确定这是不是最好的方式,但我在一条线上找东西,这对我有用
mydict.Keys.ToList().ForEach(k => mydict[k] = false);
答案 4 :(得分:2)
我描述了比利和里德的解决方案之间的区别。 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实际上更快。
答案 5 :(得分:0)
从 .NET5 开始(参见 github):
foreach (var pair in dict)
dict[pair.Key] += 1;
对于 .NET5 之前:
foreach (var key in dict.Keys.ToList())
dict[key] += 1;
答案 6 :(得分:-2)
你可以拔出ToList()并直接遍历字典项
Dictionary<string, bool> dict = GetDictionary();
foreach (var pair in dict)
{
dict[pair.Key] = false;
}
答案 7 :(得分:-4)
按照你现在的方式做到这一点...... foreach很慢。 foreach可能更干净,但你使用它会带来太多的性能损失。
修改:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/