Как сделать рендомный выбор без повторений в многопотоке?

minfin

Client
Регистрация
13.01.2020
Сообщения
147
Благодарностей
101
Баллы
43
1. Кидаем значения из переменной во временный список
2. Берём из списка случайную строку с удалением
3. По свичу переходим в нужное место

88456


В 1 поток работает нормально. При запуске в многопотоке я так понимаю, что список всегда оказывается пустой.
Видимо его нужно как-то лочить, но не соображу как. Подскажите?
Или тупо сделать привязку к файлу?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 786
Благодарностей
2 450
Баллы
113
Список однозначно нужно привязать к файлу (иначе будут повторения, так как удаление строки не будет влиять на список из второго потока).
А далее - выполняем код:
Взять случайную строчку с удалением (многопоток в локе):
Random rand = new Random();
string line = string.Empty;
lock(SyncObjects.ListSyncer) {
    line = project.Lists["список"].GetItem(rand.Next(project.Lists["список"].Count).ToString(), true);
}
return line;
Ну, и если список пустой - то наверно с переменной нужно забросить строки в этот список, прежде чем выполнять данный код.

P.S. Исправил, чтобы кто-то не скопировал не работающий вариант.
 
Последнее редактирование:

minfin

Client
Регистрация
13.01.2020
Сообщения
147
Благодарностей
101
Баллы
43

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 786
Благодарностей
2 450
Баллы
113
Писал прямо на форуме без среды разработки - забыл конвертировать сгенерированное случайное число в строку.
Исравил.
C#:
Random rand = new Random();
string line = string.Empty;
lock(SyncObjects.ListSyncer) {
    line = project.Lists["список"].GetItem(rand.Next(project.Lists["список"].Count).ToString(), true);
}
return line;
 
  • Спасибо
Реакции: DevOps, minfin и one

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)