2016-07-28 65 views
0

我想知道是否有可能創建矩陣而不寫任何循環。我試着從一個簡單的範圍列表開始,但我不知道如何走得更遠。如何創建沒有循環的矩陣

Enumerable.Range(1, 4).ToList() 

這裏有3個迴路代碼:

private static int[][] calculPossibleCombinaison(){ 
    int l; 
    for (int i = 1; i < 5; i++) { 
     for (int j = 1; j < 5; j++) { 
      for (int k = 1; k < 5; k++) { 
       l = (i*j*k)-1; 
       combinaison[l][0] = i; 
       combinaison[l][1] = j; 
       combinaison[l][2] = k; 
       console.writeline("["+combinaison[l][0]+","+combinaison[l][1]+","+combinaison[l][2]+"]"); 
      } 
     } 
    } 
    return combinaison; 
} 

這是我的矩陣的結果

[1,1,1] 
[1,1,2] 
[1,1,3] 
[1,2,1] 
[1,2,2] 
[1,2,3] 
[1,3,1] 
[1,3,2] 
[1,3,3] 
[2,1,1] 
[2,1,2] 
[2,1,3] 
[2,2,1] 
[2,2,2] 
[2,2,3] 
[2,3,1] 
[2,3,2] 
[2,3,3] 
[3,1,1] 
[3,1,2] 
[3,1,3] 
[3,2,1] 
[3,2,2] 
[3,2,3] 
[3,3,1] 
[3,3,2] 
[3,3,3] 

你認爲這是可能的嗎?

THX很多

+0

肯定。非常非常如此 – BugFinder

+0

你需要使用linq或lambda表達式來查看這些鏈接:http://stackoverflow.com/questions/3183626/convert-nested-for-loops-into-single-linq-statement; http://codereview.stackexchange.com/questions/105336/convert-foreach-loop-into-linq-in-c –

+0

避免循環有什麼意義?即使有Linq你也會在內部使用它們。沒有迭代列表/矩陣/任何內容,沒有辦法通過所有的單元格。 – HimBromBeere

回答

1

試試這個

Enumerable.Range(1, 3) 
.SelectMany(x => Enumerable.Range(1, 3), (x, y) => new[] {x, y})  
.SelectMany(x => Enumerable.Range(1, 3), (x, y) => new[] {x[0], x[1], y}).ToArray(); 
+0

Gosh,thx的答案。它完美的作品:) – stix

0

您可以使用,而不是爲循環LINQ但你仍然可以擺脫循環。使用Linq很酷,但它內置了循環植入。就好像你把那些for循環放在一個函數中然後調用它一樣。 沒有循環就無法完成。

Enumerable.Range(1, 4).ToList().ForEach(i=>{ 
     Enumerable.Range(1, 4).ToList().ForEach(j=>{ 
      Enumerable.Range(1, 4).ToList().ForEach(k=>{ 
        l = (i*j*k)-1; 
       combinaison[l][0] = i; 
       combinaison[l][1] = j; 
       combinaison[l][2] = k; 
      }); 
     }); 
}); 

遞歸:

int i=0,j=0,k=0; 

    public void MakeMartix(){ 

     if(i>3){i=0;j++;} 
     if(j>3){j=0;k++;} 
     if(k>4)return; 
     l = (i*j*k)-1; 
     combinaison[l][0] = i; 
     combinaison[l][1] = j; 
     combinaison[l][2] = k; 
       i++; 
       MakeMatirx(); 
    } 
+0

它可以通過鏈接或其他方式完成,以及如何?我想有一行像Enumerable.Range(1,4).ToList() – stix

+0

它可以但正如我所說的它隱藏循環而不是,不使用它們 –

+0

你知道該怎麼做嗎?因爲我沒有做。我知道這就像隱藏它們。 – stix