Вариант 1: zip, shuffle, unzip
Чтобы расширить комментарий Марсело, и предположим, что вы не против создать новые списки вместо перетасовки существующих списков:
var zipped = listA.Zip(listB, (a, b) => new { a, b } ).ToList();
Shuffle(zipped);
var newListA = zipped.Select(pair => pair.a).ToList();
var newListB = zipped.Select(pair => pair.b).ToList();
Вариант 2: перетасовать индексы
Расширить ответ MAK с помощью кода:
var indexes = Enumerable.Range(0, listA.Count).ToList();
Shuffle(indexes);
var newListA = indexes.Select(index => listA[index]).ToList();
var newListB = indexes.Select(index => listB[index]).ToList();
Конечно, оба подхода могут видоизменить исходные списки, с немного большей работой.
Вариант 3: перемешать оба списка одним и тем же случайным начальным числом
Лично мне нравится передавать Random
(или что-то еще) в методы / классы, которые нуждаются в них вместо создания новых. Поэтому я бы дал свой параметр Shuffle
a Random
. Это позволяет избежать различных проблем и хорошо выражает зависимость. Вы можете использовать это в своих интересах, создав два Random
экземпляра с одинаковым начальным числом:
int seed = existingRandom.Next();
Shuffle(listA, new Random(seed));
Shuffle(listB, new Random(seed));
Если предположить, что Shuffle
делает то же самое, если задана одна и та же последовательность случайных чисел, это перетасует оба списка одинаково.