Подтвердить что ты не робот

Список перетасовки <T>

Возможный дубликат:
Рандомизировать список <T> в С#

У меня есть список, который содержит много тысяч FilePath для местоположения аудиофайлов, и задавался вопросом, какой из них будет наиболее эффективным способом "перетасовать" список?

Любая помощь приветствуется:)

Спасибо

4b9b3361

Ответ 1

Fisher-Yates Shuffle или как его называют также, Knuth shuffle.

Ответ 2

Вот простая (но эффективная) реализация Fischer-Yates/Knuth shuffle:

Random rnd = new Random();
for (int i = files.Length; i > 1; i--) {
  int pos = rnd.Next(i);
  var x = files[i - 1];
  files[i - 1] = files[pos];
  files[pos] = x;
}

Или небольшое изменение:

Random rnd = new Random();
for (int i = 1; i < files.Length; i++) {
  int pos = rnd.Next(i + 1);
  var x = files[i];
  files[i] = files[pos];
  files[pos] = x;
}

Поскольку это операция O (n), это самый эффективный способ перетасовки списка. Поскольку все элементы в списке должны иметь возможность перемещаться, невозможно перетасовать список более эффективно, чем O (n).

Я сделал небольшой тест производительности, перетасовывая миллион элементов в тысячу раз каждый, используя этот метод и принятый в настоящее время ответ (LINQ OrderBy), и это примерно в 15 раз (!) быстрее.

Ответ 3

myList.OrderBy(Guid.NewGuid())

Ответ 4

Я добавил решение Jon Skeet из этого вопроса в мою библиотеку расширений. Я реализовал методы, которые берут генератор случайных чисел и создают один, используя реализацию по умолчанию (Random).