選項1:拉鍊,洗牌,解壓
爲了擴大對馬塞洛的評論,假設你不介意創建新列表,而不是洗牌的現有的國家:
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
一個Random
參數。它避免了各種問題,並很好地表達了依賴關係。你可以用你的優勢,通過使用相同的種子創建兩個Random
實例:給定的隨機數相同的序列時,
int seed = existingRandom.Next();
Shuffle(listA, new Random(seed));
Shuffle(listB, new Random(seed));
假設Shuffle
做同樣的事情,這會以同樣的方式洗牌兩份名單。
zip,shuffle,unzip – 2012-03-14 23:10:43