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# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

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.

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.

1 Kommentare zum Snippet

Enrico Wüstenberg schrieb am 22.10.2019:
Statt der For-Schelife könntest du auch einfach ein .Top(maxCount) genehmen. Ist lesbarer. Und ein bisschen performanter.
 

Logge dich ein, um hier zu kommentieren!