Как изменить порядок (перемешать) элементвов в списке IList<T>
Как перемешать элементы списка (.NET)
2
Новые ответы
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();
Действительно, выглядит очень интересно)