Feedback

C# - Zufälliger Eintrag aus einer Liste (Extension Method)

Veröffentlicht von am 25.07.2010
(0 Bewertungen)
Eine kleine aber feine Methode, die aus einer Enumeration einen zufälligen Eintrag zurück gibt.
Die Methode kann auf jede IEnumerable<T> angewendet werden.
Die Methode merkt sich NICHT, welche Einträge bereits zurück gegeben wurden. In der Statistik würde man dazu sagen "Ziehen mit Zurücklegen" ;).

var list = new List<MyClass>();
list.Add(new MyClass("Eins"));
list.Add(new MyClass("Zwei"));

// anItem ist entweder "Eins" oder "Zwei"
var anItem = list.Random();

GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

        private static Random _randomCache;

        /// <summary>
        /// return a random item from source list
        /// </summary>
        /// <typeparam name="T">generic type</typeparam>
        /// <param name="source">source list</param>
        /// <returns>random item</returns>
        public static T Random<T>(this IEnumerable<T> source)
        {
            // use static randomizer
            if (_randomCache == null) _randomCache = new Random(DateTime.Now.Millisecond);

            // get index of random item
            int index = _randomCache.Next(source.Count());

            // return first item after a skip of "index"
            return source.Skip(index).First();
        }

Abgelegt unter IEnumerable, Random, .

2 Kommentare zum Snippet

Keks1911 schrieb am 25.07.2010:
Die Zeile "if (_randomCache == null) _randomCache = new Random(DateTime.Now.Millisecond);" kann man sich sparen, wenn man Random bereits statisch initialisiert.
Koopakiller schrieb am 14.08.2013:
@Keks1911
Man muss das Objekt vorher sehr wohl initialisieren. Was du schreibst würde für Strukturen zutreffen, aber nicht für ein Klassenobjekt. Und da Random eine Klasse ist...

Ich würde die Initialisierung aber wahrscheinlich direkt in der Klasse machen:
private static Random _randomCache = new Random();

Dadurch könnte man sich die Abfrage wirklich sparen.
 

Logge dich ein, um hier zu kommentieren!