Mam ArrayList i muszę być w stanie kliknąć przycisk, a następnie losowo wybrać ciąg z tej listy i wyświetlić go w oknie komunikatu.
Jak miałbym to zrobić?
Utwórz Random
gdzieś instancję klasy. Pamiętaj, że bardzo ważne jest, aby nie tworzyć nowej instancji za każdym razem, gdy potrzebujesz losowej liczby. Powinieneś ponownie użyć starej instancji, aby osiągnąć jednorodność wygenerowanych liczb. Możesz static
gdzieś mieć pole (uważaj na kwestie bezpieczeństwa wątków):
static Random rnd = new Random();
Poproś Random
instancję o podanie losowej liczby z maksymalną liczbą elementów w ArrayList
:
int r = rnd.Next(list.Count);
Wyświetl ciąg:
MessageBox.Show((string)list[r]);
Next(max)
połączenia jest wyłączne.Zwykle używam tej małej kolekcji metod rozszerzenia:
W przypadku silnie wpisanej listy pozwoli to na napisanie:
Jeśli wszystko, co masz, to ArrayList, możesz rzucić:
źródło
return list[rnd.Next(list.Count)];
Random
zamiast tego trzymanie instancji w stanie statycznym.Możesz to zrobić:
źródło
Utwórz
Random
instancję:Pobierz losowy ciąg:
Pamiętaj jednak, że jeśli często to robisz, powinieneś ponownie użyć
Random
obiektu. Umieść go jako pole statyczne w klasie, aby było ono inicjowane tylko raz, a następnie dostęp do niego.źródło
Lub prosta klasa rozszerzenia taka jak ta:
Następnie wystarczy zadzwonić:
Działa również dla tablic.
Unikałbym dzwonienia,
OrderBy()
ponieważ może to być drogie w przypadku większych kolekcji. WList<T>
tym celu użyj indeksowanych kolekcji takich jak lub tablic.źródło
IList
więc drugie przeciążenie nie jest konieczne.Dlaczego nie:
źródło
źródło
maxValue
parametrem metodyNext
powinna być tylko liczba elementów na liście, a nie minus jeden, ponieważ zgodnie z dokumentacją „ maxValue jest wyłączną górną granicą liczby losowej ”.Używam tego ExtensionMethod od dłuższego czasu:
źródło
Zasugeruję inne podejście: jeśli kolejność elementów na liście nie jest ważna przy ekstrakcji (a każdy element powinien zostać wybrany tylko raz), to zamiast
List
możesz użyćConcurrentBag
bezpiecznej dla wątków, nieuporządkowanej kolekcji obiekty:EventHandler:
TryTake
Będą próbować wyodrębnić „random” obiekt z kolekcji nieuporządkowanej.źródło
Potrzebowałem więcej przedmiotu zamiast jednego. Więc napisałem to:
Dzięki temu możesz uzyskać elementy, które chcesz tak losowo, jak to:
źródło
Drukowanie losowej nazwy kraju z pliku JSON.
Model:
Implementacja:
źródło
Dlaczego nie [2]:
źródło