2011-11-03 24 views
6

John Skeets對此問題的回答爲Select all unique combinations of a single list, with no repeats, using LINQ,工作非常棒。使用LINQ(第2部分)選擇單個列表的所有唯一組合,但不重複使用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

它在概念這大致相當於,雖然實際執行模型當然是不同(懶惰等):

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採取從valueindex投影是同時使用的方式和i作出內部循環。我們需要索引,以便我們可以跳過index + 1值,這相當於上面代碼中從i + 1開始的j循環。

這有幫助嗎?如果沒有,你能指出哪一點令人困惑?

編輯:啊哈 - 我還沒有意識到,你提到的另一個問題是從這段代碼開始的!我認爲它仍然是有用的,雖然,給以下段落的東西掛在...

如果你理解我的答案的替代(查詢表達式)版本,那麼第一個版本是類似的,只是使用SelectMany這允許您在「外部」序列中使用值和索引。

+0

因此,您正在使用SelectMany的這個重載版本,http://msdn.microsoft.com/zh-cn/library/bb534732.aspx,所以collectionSelector會創建「內部循環」,即。 {2,index = 1} {3,index = 2},並給出resultSelector(第二個lambda函數)的結果?我理解你的其他例子,我想我的困惑是與lambda函數以及第二個lambda函數如何構建列表。 – Seth

+0

@Seth:集合選擇器是在這個答案的代碼中獲得'i'和'first'的等價位。這些值(我和第一個)然後在'resultSelector'中使用。 –