Как перетасовать массив, сохраняя сгруппированные вместе одинаковые значения?

Скажем, у меня есть такой массив.

      int[] arr = {1,2,3,4,4,5,6,7,8,8,8};

Как мне перемешать их, но все с одинаковым значением по-прежнему расположены друг напротив друга?

Пример ожидаемого результата после перемешивания:

      3,1,8,8,8,7,2,4,4,6,5

2 ответа

Вы можете сделать что-то вроде этого:

  • Найдите уникальные значения в массиве и количество повторений каждого из них. Сохраните счетчики в словаре, скажем counts.
  • Перемешайте уникальные значения, используя алгоритм перемешивания, такой как Fisher-Yates.
  • Для каждого значения в перетасованном массиве напишите v в выходной массив counts[v] раз.
      arr = arr
    .GroupBy(i => i)
    .OrderBy(g => rnd.Next())
            .SelectMany(g => g)
            .ToArray();
Другие вопросы по тегам