Как перемешать элементы списка (.NET) - CodeHelper

Как перемешать элементы списка (.NET)

2

Как изменить порядок (перемешать) элементвов в списке IList<T>

Новые ответы


3

Можно реализовать простейший алгоритм Фишера-Ятеса (Fisher–Yates shuffle). Говорят даже, что этот алгоритм упоминается в книгах Кнута. Вот реализация через extension:

public static void Shuffle<T>(this IList<T> list)  
{  
    Random random = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = random.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}
1

Еще вариант в виде extension:

public static void Randomize<T>(this IList<T> target)
    {
        Random RndNumberGenerator = new Random();
        SortedList<int, T> newList = new SortedList<int, T>();
        foreach (T item in target)
        {
            newList.Add(RndNumberGenerator.Next(), item);
        }
        target.Clear();
        for (int i = 0; i < newList.Count; i++)
        {
            target.Add(newList.Values[i]);
        }
    }

Взято здесь

2

Неэффективный, но красивый метод:

Random r = new Random();
List<int> list = source.OrderBy(x=>r.Next()).ToList();
admax

Действительно, выглядит очень интересно)


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.