Я не уверен, что мне нравится это направление, но ...
Чтобы делать в точности то, что вы просите (закон, а не дух закона), вам нужно будет добавить дополнительные массивы и переместить элементы. Кроме того, для каждого массива вам потребуется список или аналогичный элемент для хранения элементов, которые вы уже случайно перетянули. После этого все просто. Используйте класс Random для создания случайных чисел, проверьте, не был ли элемент уже перемещен (используя Список), если не сохраните результат в новом массиве / списке, добавьте значение в свой Список, чтобы убедиться, что вы не перемещаете его пункт дважды. Как только все будет перемещено, установите этот новый массив в старый массив.
Теперь, что является бизнес-причиной для рандомизации? Это может повлиять на то, является ли это хорошей идеей.
ДОБАВЛЕНО:
После изучения ответа скита, вот способ решить эту проблему, если вы можете использовать следующий тип класса:
public class Report {
public string Text { get; set; }
public string Image { get; set; }
public string Explanation { get; set; }
}
Вот один из типов "грязных":
private static SortedList<int, Report> SortRandomly(List<Report> reports)
{
Random rnd = new Random((int)DateTime.Now.Ticks);
List<int> usedNumbers = new List<int>();
SortedList<int, Report> sortedReports = new SortedList<int, Report>();
int maxValue = reports.Count;
foreach(Report report in reports)
{
bool finished = false;
int randomNumber = 0;
//Get unique random (refactor out?)
while(!finished)
{
randomNumber = rnd.Next(0, maxValue);
if(!usedNumbers.Contains(randomNumber))
{
finished = true;
usedNumbers.Add(randomNumber);
}
}
sortedReports.Add(randomNumber, report);
}
return sortedReports;
}
Обратите внимание, что вы также можете работать в порядке сортировки и случайного выбора из исходного списка, что означает, что вы можете, теоретически, сохранить его в виде списка.
private static List<Report> SortRandomly(List<Report> reports)
{
Random rnd = new Random((int)DateTime.Now.Ticks);
List<Report> outputList = new List<Report>();
List<int> usedNumbers = new List<int>();
int maxValue = reports.Count-1;
while(outputList.Count < reports.Count)
{
int randomNumber = rnd.Next(0, maxValue);
if(!usedNumbers.Contains(randomNumber))
{
outputList.Add(reports[randomNumber]);
}
}
return outputList;
}
Еще лучше, рассмотрите сначала сортировку списка номеров, а затем сбор отчетов по порядку. Опять же, вышеприведенное не работает, и грязные реализации и использование особых требований, безусловно, улучшат алгоритмы.