2016-07-28 16 views
0

Ich würde gerne wissen, ob es möglich ist, eine Matrix zu erstellen, ohne eine Schleife zu schreiben. Ich versuche, mit einer einfachen Liste der Reichweite zu beginnen, aber ich weiß nicht, wie ich weiter gehen soll.So erstellen Sie eine Matrix ohne Schleife

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

Hier ist der Code mit 3 Schlaufen:

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; 
} 

Dies ist das Ergebnis meiner Matrix

[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] 

Denken Sie, es ist möglich?

Thx viel

+0

ja. sehr viel – BugFinder

+0

Sie müssen Linq oder Lambda-Ausdruck dafür verwenden, überprüfen Sie diesen Link: http://StackOverflow.com/Questions/3183626/convert-nested-for-loops-into-Single-Linq-Anweisung; http://codereview.stackexchange.com/questions/105336/convert-foreach-loop-into-linq-in-c –

+0

Was ist der Punkt Schleifen zu vermeiden? Selbst mit Linq würden Sie sie intern verwenden. Es gibt keine Möglichkeit, durch alle Zellen zu gehen, ohne die Liste/Matrix/was auch immer zu durchlaufen. – HimBromBeere

Antwort

1

testen

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. Es funktioniert perfekt :) – stix

0

Sie LINQ verwenden können, anstatt für Schleifen, aber trotzdem kann man von Schleifen loszuwerden. mit Linq ist cool, aber es hat Loop-Implantation drin. als ob Sie diese für Schleifen in eine Funktion einfügen und sie dann aufrufen. Es kann nicht ohne Schleifen gemacht werden.

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; 
      }); 
     }); 
}); 

Rekursiv:

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

Kann es mit Link oder etwas anders gemacht werden und wie? Ich hätte gerne eine Zeile dafür wie Enumerable.Range (1, 4) .ToList() – stix

+0

Es kann aber, wie ich sagte, es ist wie das Verbergen der Schleifen und nicht, nicht mit ihnen –

+0

Wissen Sie, wie es geht? weil ich nicht. Und ich weiß, es ist, als würde man sie verstecken. – stix

Verwandte Themen