2012-03-14 14 views
1

に、私は彼らが私は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、
B:?

W Y、X、Zは、C#でShuffleTwoLists(LISTA、ListBの)を実装する簡単な方法があります

+6

ジップ、シャッフル、解凍 –

答えて

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の答えにND:もちろん

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(または何でも)を渡したい

で両方のリストをシャッフルします。だから、私はShuffleRandomというパラメータを与えるだろう。さまざまな問題を回避し、依存関係をうまく表現します。あなたが同じシードで2つのRandomのインスタンスを作成することによって、あなたの利点にこれを使用することができます:

int seed = existingRandom.Next(); 
Shuffle(listA, new Random(seed)); 
Shuffle(listB, new Random(seed)); 

と仮定Shuffleは同じことを同じ乱数列が与えられたとき、これは同じように両方のリストをシャッフルします。

+0

+1、私は誰かが私よりも怠け者になることを望んでいた。 –

+0

@MarceloCantos:私はあなたが私の考えを使用して気にしないことを望んでいた間: –

+0

シャッフル(インデックス)気にしない; ;) – sasjaq

2

を取ります内容がすべてのintの新しいリスト数字は[0, length of A and B)です。これらはあなたのリストの要素のインデックスに対応しています。そのリストをシャッフルしてください。シャッフルされたインデックスを使用して元のリストの両方を並べ替えることができます。

+0

一般的な解決策を探しています。サンプルを更新します。 – Gjorgji

+3

@Gjorgji:これは一般的な解決策です。ここでの 'int'値は元のリストの値ではなく、*索引*です。元のリストは、文字列、Guids、何でもかまいません。 –

5

ジョンの技法はすべて良好です。追加の手法は次のとおりです。

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の配列をシャッフルして順列を作ります。 2つの異なるリストに同じ置換配列を適用すると、2つの異なるリストと同じ "シャッフル"が得られます。理にかなっている?

+1

そして、他の人がいなければ 'ランダム'の依存性注入に重点を置いて)私は自分の考えを思いついたので、私の3番目の解決策が個人的にはかなり好きです。 –

+0

+1 - 私は、このメソッドがC++のポインターのコレクションに似ているので、質問で提示された(int値だけで)このメソッドが好きですが、 'permutation'がコレクションではない'int'の –

関連する問題