У меня есть ArrayList, и мне нужно иметь возможность нажать кнопку, а затем случайным образом выбрать строку из этого списка и отобразить ее в окне сообщения.
Как бы я поступил так?
Создайте экземпляр Random
класса где-нибудь. Обратите внимание, что очень важно не создавать новый экземпляр каждый раз, когда вам нужно случайное число. Вы должны повторно использовать старый экземпляр для достижения однородности сгенерированных чисел. У вас может быть static
поле где-то (будьте осторожны в вопросах безопасности потоков):
static Random rnd = new Random();
Попросите Random
экземпляр дать вам случайное число с максимальным количеством элементов в ArrayList
:
int r = rnd.Next(list.Count);
Показать строку:
MessageBox.Show((string)list[r]);
Next(max)
вызове является эксклюзивной.Я обычно использую эту небольшую коллекцию методов расширения:
Для строго типизированного списка это позволит вам написать:
Если у вас есть только ArrayList, вы можете разыграть его:
источник
return list[rnd.Next(list.Count)];
Random
вместо этого удерживать экземпляр в статическом состоянии.Ты можешь сделать:
источник
Создайте
Random
экземпляр:Получить случайную строку:
Помните, однако, что если вы делаете это часто, вы должны повторно использовать
Random
объект. Поместите его как статическое поле в классе, чтобы оно инициализировалось только один раз, а затем получите к нему доступ.источник
Или простой класс расширения, например:
Тогда просто позвоните:
Работает и для массивов.
Я бы не стал звонить, так
OrderBy()
как это может быть дорого для больших коллекций.List<T>
Для этой цели используйте индексированные коллекции, такие как или массивы.источник
IList
поэтому вторая перегрузка не нужна.Почему нет:
источник
источник
maxValue
параметр методаNext
должен быть просто числом элементов в списке, а не минус один, потому что согласно документации « maxValue является исключительной верхней границей случайного числа ».Я использую этот ExtensionMethod некоторое время:
источник
Я предложу другой подход. Если порядок элементов в списке не важен при извлечении (и каждый элемент должен быть выбран только один раз), то вместо «a»
List
вы можете использовать a,ConcurrentBag
который является потокобезопасным, неупорядоченным набором объекты:EventHandler:
TryTake
Будет пытаться извлечь «случайный» объект из неупорядоченной коллекции.источник
Мне нужно было больше предметов вместо одного. Итак, я написал это:
С этим вы можете получить элементы, сколько вы хотите, так случайным образом, как это:
источник
Печать случайного названия страны из файла JSON.
Модель:
Implementaton:
источник
Почему бы не [2]:
источник