Eu tenho um ArrayList e preciso clicar em um botão e escolher aleatoriamente uma sequência dessa lista e exibi-la em uma caixa de mensagens.
Como eu faria isso?
Crie uma instância da Random
classe em algum lugar. Observe que é muito importante não criar uma nova instância sempre que você precisar de um número aleatório. Você deve reutilizar a instância antiga para obter uniformidade nos números gerados. Você pode ter um static
campo em algum lugar (tenha cuidado com os problemas de segurança do encadeamento):
static Random rnd = new Random();
Peça à Random
instância para fornecer um número aleatório com o máximo do número de itens no ArrayList
:
int r = rnd.Next(list.Count);
Exiba a sequência:
MessageBox.Show((string)list[r]);
Next(max)
chamada é exclusivo.Eu costumo usar esta pequena coleção de métodos de extensão:
Para uma lista fortemente tipada, isso permitiria escrever:
Se tudo o que você tem é um ArrayList, é possível convertê-lo:
fonte
return list[rnd.Next(list.Count)];
Random
no estado estático.Você pode fazer:
fonte
Crie uma
Random
instância:Busque uma sequência aleatória:
Lembre-se, porém, que se você fizer isso com frequência, deverá reutilizar o
Random
objeto. Coloque-o como um campo estático na classe, para que seja inicializado apenas uma vez e depois acesse-o.fonte
Ou classe de extensão simples como esta:
Em seguida, basta ligar para:
Funciona para matrizes também.
Eu evitaria ligar
OrderBy()
, pois pode ser caro para coleções maiores. Use coleções indexadas comoList<T>
ou matrizes para esse fim.fonte
IList
portanto a segunda sobrecarga é desnecessária.Por que não:
fonte
fonte
maxValue
parâmetro do métodoNext
deve ser apenas um número de elementos em uma lista, não menos um, porque de acordo com a documentação " maxValue é o limite superior exclusivo do número aleatório ".Estou usando este ExtensionMethod há algum tempo:
fonte
Sugiro uma abordagem diferente: se a ordem dos itens dentro da lista não for importante na extração (e cada item deve ser selecionado apenas uma vez), em vez de um,
List
você pode usar umConcurrentBag
que é uma coleção não ordenada e segura de threads objetos:O EventHandler:
O
TryTake
tentará extrair um objeto "aleatório" da coleção não ordenada.fonte
Eu precisava de mais itens em vez de apenas um. Então, eu escrevi isso:
Com isso, você pode obter elementos quantos quiser, de forma aleatória assim:
fonte
Imprimindo aleatoriamente o nome do país a partir do arquivo JSON.
Modelo:
Implementação:
fonte
Por que não [2]:
fonte