Получить случайный элемент из параллельного словаря c # - PullRequest
0 голосов
/ 28 мая 2018

Я ищу структуру данных, которая способна хорошо обрабатывать параллелизм (поскольку произойдет удаление и добавление из нескольких потоков) и которая позволяет быстро сопоставить (O (1)) из хешированного ключа соответствующийобъект.

Я также должен иметь возможность произвольно получать элементы X из этой структуры данных.

Я начал с Set, но, как ни странно, реализации ConcurrentSet нет, и я хочу получить ссылкук моему объекту, так как я хочу что-то с ним делать.

В настоящее время у меня есть ConcurrentDictionary, который отображает int (хэшированное значение) на объект.Кажется, это хорошо работает для первых требований, но это совсем не удобно для случайного выбора элементов.Я думал о преобразовании значений в массив и случайном выборе из этого, но я не думаю, что это будет соответствовать сложности и памяти.

Есть ли способ сделать это?Или другой подход к этой проблеме, который позволил бы мне иметь хорошие характеристики для одновременного отображения объектов и случайного выбора некоторых?

1 Ответ

0 голосов
/ 28 мая 2018

Итерация по ConcurrentDictionary свободна от блокировки и относительно дешева.Я бы предложил выбрать несколько случайных чисел от 0 до dict.Count - 1, затем выполнить итерацию с foreach или LINQ и извлечь элементы по этим индексам.

Но все решение зависит от варианта использования.Если вы редко обновляете словарь, но часто читаете его, вы можете рассмотреть семантику copy-on-write, которая позволяет работать с «снимком» данных: https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/CopyOnWriteConcurrentDictionary.cs

...