2016-06-13 222 views
1

這是以前發佈的後續問題。在澄清我先前的問題後,建議我在問題發生急劇變化時發表一個新帖子,這是一個很好的建議。這裏是原來的問題:Why doesn't this LINQ Select expression work創建一個列表,從每個嵌套列表中獲取一個元素

更新的問題如下。我想要的是獲得每一個排列,每個新組只由列表中的一個元素組成。作爲一個例子:

List<List<int>> oldList = {{1,2},{3,4}}; 
List<List<int>> newList = {{1,3},{1,4},{2,3},{2,4}}; 

我在找一些方法來將oldList轉換成newList。我面臨的挑戰是我不知道每個列表中會有多少嵌套列表或多少個項目。你可以假設每個嵌套列表是完全相同的長度。有任何想法嗎?謝謝你的幫助。

回答

1

你可以閱讀關於計算使用LINQ的笛卡爾產品的Eric Lippert的this的帖子。

這個想法是訪問每個列表與當前的笛卡爾產品集製作該列表的笛卡爾積。

這是代碼:

static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sequences) 
{ 
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 

    return sequences.Aggregate(emptyProduct, (accumulator, sequence) => 
     from accseq in accumulator 
     from item in sequence 
     select accseq.Concat(new[] { item })); 
} 

用法:

var newList = CartesianProduct(oldList); 
+0

謝謝!在編程之前我沒有停下來意識到我需要笛卡兒積,我會把我的頭埋在恥辱中! – michaelto20

相關問題