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]

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

        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!