Feedback

C# - Beliebig viele zufällige Items aus Liste holen, keins doppelt

Veröffentlicht von am 21.08.2019
(0 Bewertungen)
Ich stand neulich vor der Aufgabe, beliebig viele zufällige Elemente aus einer Liste zu holen. Dabei sollte kein zufälliges Element doppelt zurückgegeben werden. Dafür habe ich eine generische Erweiterungsmethode geschrieben. In der Erweiterungsmethode werden zuerst alle Elemente durchmischt. Dann werden zufälligen Items mit einer for-Schleife aus der durchmischten Liste geholt.
Sind in der List weniger Elemente vorhanden als angefordert, dann werden nur so viel Elemente zurück gegeben, wie vorhanden sind.

Hier ist ein Beispielaufruf:
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list.Add(5);
list.Add(6);
list.Add(7);
list.Add(8);
list.Add(9);
list.Add(10);

list = list.GetRandomItems(8);

for (int i = 0; i < list.Count; i++)
Console.Write(list[i] + " ");

Console.Read();


Die Ausgabe wäre dann zum Beispiel:
4 3 1 7 8 2 9 5
GFU-Schulungen  [Anzeige]

C# Grundlagen

Die Schulung vermittelt Ihnen die Grundlagen von C# in der Arbeit mit Datentypen sowie bei Klassenbibliotheken. Sie lernen, mit Variablen umzugehen und deren verschiedene Formen zu konvertieren. 

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.

public static class ListExtensions
{
    private static Random rnd = new Random();

    public static List<T> GetRandomItems<T>(this IList<T> list, int maxCount)
    {
        List<T> resultList = new List<T>();
        list.Shuffle();

        for (int i = 0; i < maxCount && i < list.Count; i++)
            resultList.Add(list[i]);

        return resultList;
    }

    private static void Shuffle<T>(this IList<T> list)
    {
        int n = list.Count;
        while (n > 1)
        {
            n--;
            int k = rnd.Next(n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}
Abgelegt unter list, liste, zufall, random, item.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!