Feedback

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

Veröffentlicht von am 8/21/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
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 10/22/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!