C# 从并发字典c中获取随机元素#

C# 从并发字典c中获取随机元素#,c#,concurrentdictionary,C#,Concurrentdictionary,我正在寻找一种能够很好地处理并发性的数据结构(从多个线程中进行删除和添加),它允许我快速地(O(1))从散列键映射到相应的对象 我还必须能够从这个数据结构中随机检索X个元素 我从一个集合开始,但奇怪的是没有ConcurrentSet实现,我想检索对我的对象的引用,因为我想用它来做一些事情 我目前有一个ConcurrentDictionary,它将int(散列值)映射到对象。对于第一个需求来说,这似乎很好,但对于随机拾取元素来说,这一点都不方便。我曾考虑过将值转换为数组并从中随机选取,但我认为这不

我正在寻找一种能够很好地处理并发性的数据结构(从多个线程中进行删除和添加),它允许我快速地(O(1))从散列键映射到相应的对象

我还必须能够从这个数据结构中随机检索X个元素

我从一个集合开始,但奇怪的是没有ConcurrentSet实现,我想检索对我的对象的引用,因为我想用它来做一些事情

我目前有一个ConcurrentDictionary,它将int(散列值)映射到对象。对于第一个需求来说,这似乎很好,但对于随机拾取元素来说,这一点都不方便。我曾考虑过将值转换为数组并从中随机选取,但我认为这不符合复杂性和内存的要求


有办法做到这一点吗?或者是另一种解决这个问题的方法,它允许我同时映射对象并随机选取一些对象,这是一种性能很好的方法?

迭代
ConcurrentDictionary
是无锁且相对便宜的方法。 我建议从
0
dict.Count-1
中选取一组随机数,然后使用
foreach
或LINQ进行迭代,并检索这些索引中的项


但是整个解决方案取决于用例。如果你很少更新字典,但经常阅读它,你可能会考虑<代码>拷贝>写/代码>语义,它允许在数据的快照上运行:

你尝试过并发包吗?我必须能够从数据结构中删除元素。使用ElementAt进行检索?非常确定您可以使用
TryTake
method从中删除一个元素。另外,还可以看看F#并发作为一种替代解决方案,内置到.net中也有写时复制语义