J'ai une ArrayList, et je dois pouvoir cliquer sur un bouton, puis choisir au hasard une chaîne de cette liste et l'afficher dans une boîte de message.
Comment pourrais-je procéder?
Créez une instance de Random
classe quelque part. Notez qu'il est assez important de ne pas créer une nouvelle instance chaque fois que vous avez besoin d'un nombre aléatoire. Vous devez réutiliser l'ancienne instance pour obtenir l'uniformité des nombres générés. Vous pouvez avoir un static
champ quelque part (faites attention aux problèmes de sécurité des threads):
static Random rnd = new Random();
Demandez à l' Random
instance de vous donner un nombre aléatoire avec le maximum du nombre d'articles dans ArrayList
:
int r = rnd.Next(list.Count);
Affichez la chaîne:
MessageBox.Show((string)list[r]);
Next(max)
appel est exclusive.J'utilise généralement cette petite collection de méthodes d'extension:
Pour une liste fortement typée, cela vous permettrait d'écrire:
Si tout ce que vous avez est une ArrayList, vous pouvez le lancer:
la source
return list[rnd.Next(list.Count)];
Random
plutôt de conserver une instance de dans un état statique.Tu peux faire:
la source
Créez une
Random
instance:Récupère une chaîne aléatoire:
N'oubliez pas cependant que si vous le faites fréquemment, vous devez réutiliser l'
Random
objet. Mettez-le en tant que champ statique dans la classe afin qu'il ne soit initialisé qu'une seule fois, puis accédez-y.la source
Ou une classe d'extension simple comme celle-ci:
Ensuite, appelez simplement:
Fonctionne également pour les tableaux.
J'éviterais d'appeler
OrderBy()
car cela peut coûter cher pour les grandes collections. Utilisez des collections indexées commeList<T>
ou des tableaux à cet effet.la source
IList
donc la deuxième surcharge n'est pas nécessaire.Pourquoi pas:
la source
la source
maxValue
paramètre de méthodeNext
devrait être juste un certain nombre d'éléments dans une liste, pas moins un, car selon une documentation " maxValue est la limite supérieure exclusive du nombre aléatoire ".J'utilise cette ExtensionMethod depuis un certain temps:
la source
Je suggère une approche différente.Si l'ordre des éléments dans la liste n'est pas important lors de l'extraction (et que chaque élément ne doit être sélectionné qu'une seule fois),
List
vous pouvez utiliser unConcurrentBag
qui est une collection non ordonnée de thread-safe objets:Le gestionnaire d'événements:
Le
TryTake
tentera d'extraire un objet "aléatoire" de la collection non ordonnée.la source
J'avais besoin de plus d'articles au lieu d'un seul. J'ai donc écrit ceci:
Avec cela, vous pouvez obtenir des éléments combien vous voulez comme au hasard comme ceci:
la source
Impression aléatoire du nom du pays à partir du fichier JSON.
Modèle:
Implémentation:
la source
Pourquoi pas [2]:
la source