如果我有ConcurrentDictionary
实例,那么是否使用Count
属性或LINQ的Any()
无关紧要?我宁愿写dict.Any()
而不是dict.Count > 0
,因为我认为Any()
更具描述性。
我只关注正确性,而不关注性能。用例是
void process()
{
if (concurrentDictionary.Count <= 0) // or !Any() ?
return; // dictionary is empty, nothing to do
// ...
}
最佳答案
问题Are IEnumerable Linq methods thread-safe?解决了以下事实:如果不保持特定的锁来保护集合,则LINQ查询上的IEnumerable方法不是线程安全的。
您可以查看reference code for ConcurrentDictionary来查看该枚举器没有提供线程安全的快照。有关ConcurrentDictionary.GetEnumerator的其他MSDN文档指出:
从字典返回的枚举数可以安全地与对字典的读取和写入同时使用,但是它不代表字典的即时快照。通过枚举器公开的内容可能包含在调用GetEnumerator之后对字典所做的修改。
Count属性对字典具有完全锁定,并返回一致的结果。
因此,根据是否要锁定字典来运行Any()
,检查Count > 0
可能更干净。
关于.net - ConcurrentDictionary.Count> 0是否与ConcurrentDictionary.Any()相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29399256/