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]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

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!