在C#中设置Dictionary所有值的最佳方法是什么?
这是我现在正在做的,但我相信有更好/更清晰的方法:
Dictionary<string,bool> dict = GetDictionary();
var keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
dict[keys[i]] = false;
}
我已经尝试了一些使用foreach的方法,但是遇到了错误。
在C#中设置Dictionary所有值的最佳方法是什么?
这是我现在正在做的,但我相信有更好/更清晰的方法:
Dictionary<string,bool> 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);
dict = dict.Keys.ToDictionary(x => x, _ => false);
- Gerardo MarsetHashSet<string>
,并调用Clear()
将值设置为“false”。HashSet
中,则为true。如果不在HashSet
中,则为false。使用Add/Remove而不是设置true/false。这将非常快,但无法表示第三个“缺失”状态。 - Sam Harwell我不确定这是否是最佳方式,但我正在寻找单行内容,并且这对我有用
mydict.Keys.ToList().ForEach(k => mydict[k] = false);
从.NET5开始(参见GitHub):
foreach (var pair in dict)
dict[pair.Key] += 1;
在.NET5之前:
foreach (var key in dict.Keys.ToList())
dict[key] += 1;
我对比了Billy和Reed的解决方案。 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实际上更快。
Dictionary<string, bool> dict = GetDictionary();
foreach (var pair in dict)
{
dict[pair.Key] = false;
}
按照你现在的方式去做... foreach 很慢。foreach 可能更简洁,但使用它会导致性能损失太大。
Edit:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/
foreach
方法,对于操作字典现有的内部桶而言会比较慢。 - Sam Harwellforeach
在数组中较慢,而不是在字典(或一般情况下)中较慢。此外,第一篇文章已经过时,即使应用于数组也不再正确;第二篇文章实际上测量的是Enumerable.Range
的性能,而不是foreach
本身。 - Pavel Minaev
ToList()
。请查看我的答案中的Github链接以了解更改。 - tymtam