【问题标题】:How to create a matrix without a loop如何创建没有循环的矩阵
【发布时间】:2016-07-28 12:31:25
【问题描述】:

我想知道是否可以在不编写任何循环的情况下创建矩阵。我尝试从一个简单的范围列表开始,但我不知道如何更进一步。

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]

你觉得有可能吗?

非常感谢

【问题讨论】:

标签: c# ienumerable


【解决方案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();

【讨论】:

    【解决方案2】:

    您可以使用 LINQ 代替 for 循环,但您仍然可以摆脱循环。使用 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();
        }
    

    【讨论】:

    • 可以通过链接或其他方式完成吗?如何?我想有一条线,比如 Enumerable.Range(1, 4).ToList()
    • 它可以,但正如我所说,它就像隐藏循环而不是,不使用它们
    • 你知道怎么做吗?因为我没有做。我知道这就像隐藏它们。
    • @stix 我添加了递归版本代码。看看吧。
    • 谢谢,但这不是我问的。看@tym32167的答案