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();

        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!