ConcurrentDictionary.Count > 0 与 ConcurrentDictionary.Any() 相同吗?

Ðаn*_*Ðаn 4 .net linq concurrentdictionary

如果我有一个实例,我使用该属性还是 LINQConcurrentDictionary是否重要?我宁愿写,而不是我认为更具描述性的。CountAny()dict.Any()dict.Count > 0Any()

我只关心正确性,而不关心性能。用例是

void process()
{
   if (concurrentDictionary.Count <= 0) // or !Any() ?
      return; // dictionary is empty, nothing to do

   // ...
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ham 5

问题IEnumerable Linq 方法线程安全吗?解决了 LINQ 查询上的 IEnumerable 方法在没有保留保护集合的特定锁的情况下不是线程安全的事实。

可以查看ConcurrentDictionary的参考代码,发现枚举器不提供线程安全的快照。另外ConcurrentDictionary.GetEnumerator的 MSDN 文档指出:

从字典返回的枚举器可以安全地与字典的读取和写入同时使用,但它并不代表字典的即时快照。通过枚举器公开的内容可能包含调用 GetEnumerator 后对字典所做的修改

Count 属性对字典进行完全锁定并返回一致的结果。

因此,根据您是否想要锁定字典来运行Any()它,检查Count > 0.