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]

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

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

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!