2011-11-03 10 views
6

John Skeetsの質問Select all unique combinations of a single list, with no repeats, using LINQを使用して、1つのリストのすべてのユニークな組み合わせを選択します。しかし LINQ(パート2)

は、誰かが最初の答えが働いているかの内部の仕組みコンポーネントによってコンポーネントを打破することができます

List<int> slotIds = new List<int> {1, 2, 3}; 
var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1), 
           (first, second) => new { first, second }); 
+2

そして、その答えの下のコメントでそれを聞かないのはなぜですか? –

答えて

6

実際の実行モデルはもちろん異なっているが、それは、これにコンセプトでほぼ同じです(ETC遅延):valueindexから投影を取る

for (int i = 0; i < slotIds.Count; i++) 
{ 
    int first = slotIds[i]; 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     int second = slotIds[j]; 
     results.Add(new { first, second }); 
    } 
} 
SelectMany

両方を使用する方法でありますおよびiを使用して内部ループを作成します。上記のコードでi + 1から始まるjループに相当するindex + 1の値をスキップできるように、インデックスが必要です。

これは役に立ちますか?そうでない場合、どのビットが混乱しているのかを特定できますか?

EDIT:Aargh - あなたが言っていた他の質問がこのコードで始まったことに気付かなかった!私はまだ役に立つと思っています。

私の答えの代わりの(クエリ式)バージョンを理解していれば、最初のバージョンは似ています。ちょうどSelectManyのオーバーロードを使用しています"外側"シーケンスで値とインデックスの両方を使用することができます。

+0

したがって、このオーバーロードされたバージョンのSelectMany(http://msdn.microsoft.com/en-us/library/bb534732.aspx)を使用しているので、collectionSelectorは "内部ループ"を作成します。 {2、index = 1} {3、index = 2}、結果はresultSelector(2番目のラムダ関数)に供給されますか?私はあなたの他の例を理解しています、私は混乱がラムダ関数であると思います、そして、2番目のラムダ関数がどのようにリストを構築するのか。 – Seth

+0

@Seth:コレクションセレクタは、この答えのコードで 'i'と' first'に相当するものを取得するビットです。それらの値(iと最初の値)は 'resultSelector'で使われます。 –