2012-03-14 35 views
1

我想洗牌兩個列表,這樣,他們以同樣的方式(前提是我有一個方法,隨機播放(名單列表洗牌),其打亂一個列表。以同樣的方式隨機兩個列表

List<ObjX> listA = new List<ObjX>() { A, B, C, D }; 
List<ObjX> listB = new List<ObjX>() { W, X, Y, Z }; 
ShuffleTwoLists(listA , listB) 

結果:
A:C,B,d,A
?B:Y,X,Z,W

有沒有C#實現ShuffleTwoLists(listA的,數組listB)的快捷方式

+6

zip,shuffle,unzip – 2012-03-14 23:10:43

回答

8

選項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做同樣的事情,這會以同樣的方式洗牌兩份名單。

+0

+1,我希望有人會比我懶。 – 2012-03-14 23:14:03

+0

@MarceloCantos:雖然我希望你不會介意我用你的想法:) – 2012-03-14 23:18:39

+0

你不介意洗牌(索引);? ;) – sasjaq 2012-03-15 00:21:09

2

乘坐新的int列表,其內容全部數字在[0, length of A and B)。這些對應於列表中元素的索引。隨機播放該列表。現在使用混洗索引對兩個原始列表進行排列。

+0

我在尋找一個通用的解決方案。我會更新樣本。 – Gjorgji 2012-03-14 23:13:33

+3

@Gjorgji:這*是一個通用的解決方案。這裏的int值不是原始列表中的值 - 它們是*索引*。原始列表可以是字符串,Guids,不管。 – 2012-03-14 23:19:27

5

Jon的所有技術都很好。另外一個方法是:

class PermutedList<T> 
{ 
    private readonly IList<T> underlying; 
    private readonly IList<int> permutation; 
    public T this[int i] 
    { 
     get { return underlying[permutation[i]]; } 
    } 
    ... 

也就是說,使周圍的基礎列表的包裝類。使用數字0到n-1對數組進行整理來進行置換。如果將相同的置換數組應用於兩個不同的列表,那麼您將得到兩個不同列表的相同「混洗」。合理?

+1

並且爲了增加瘋狂性,添加setter並且混淆了每個人的困惑:)(我個人非常喜歡我的第三個解決方案,現在我已經想到了......如果沒有其他的話,強調依賴注入「Random」) – 2012-03-14 23:21:43

+0

+1 - 我喜歡這個問題中提供的方法(只有'int'值),因爲它的行爲類似於C++中的指針集合,但我想知道如果'permutation'不是一個集合'int's。 – 2012-03-15 01:29:44