Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将网格n*m拆分为子网格a*b_C#_Arrays_List_Linq_Grid - Fatal编程技术网

C# 将网格n*m拆分为子网格a*b

C# 将网格n*m拆分为子网格a*b,c#,arrays,list,linq,grid,C#,Arrays,List,Linq,Grid,有一个9*9的网格,我想把它分成9个3*3的网格。 以下是我的有效解决方案: List myList=new List(); 对于(int i=0;i

有一个9*9的网格,我想把它分成9个3*3的网格。

以下是我的有效解决方案:

List myList=new List();
对于(int i=0;i<9;i=i+3)
{
对于(int j=0;j<9;j=j+3)
{
List temp1=新列表();
对于(int k=0;k<3;k++)
{
List temp2=新列表();
对于(int l=0;l<3;l++)
{
temp2.添加(网格[i+k][j+l]);
}
temp1.Add(temp2.ToArray());
}
myList.Add(temp1.ToArray());
}
}
寻找更简单的方法,特别是Linq解决方案。即使它没有这个有效。在这种情况下,更少的代码行更为重要。

让我们使用模运算:

测试:

结果:

. . .
. . 6
. . .

1 4 .
. . .
. . .

. 2 .
. . .
. . .

. . 1
. 6 7
. . .

. . .
. . .
. . .

. . .
. . 9
8 1 .

. 3 .
. . .
. . .

. . .
. . 7
5 . .

. . 6
. . .
. 7 .

您可以使用
i%3==0
获取每三个元素,并在两个循环中完成所有操作。一个在每个数组上循环,另一个检查它是否是第三个元素并相应地拆分。您是否对要“拆分”数组的位置有偏好?
List<char[][]> myList = new List<char[][]>();
for (int i = 0; i < 9; i = i + 3)
    {
    for (int j = 0; j < 9; j = j + 3)
    {
        List<char[]> temp1 = new List<char[]>();
        for (int k = 0; k < 3; k++)
        {
            List<char> temp2 = new List<char>();
            for (int l = 0; l < 3; l++)
            {
                temp2.Add(grid[i + k][j + l]);
            }
            temp1.Add(temp2.ToArray());
        }
        myList.Add(temp1.ToArray());
    }
}
  int size = 3; 

  var grids = Enumerable
    .Range(0, 9)
    .Select(index => grid            
      .Skip(index / size * size)     // Y coordinates 0..2, 3..5, 6..8
      .Take(size)
      .Select(line => line
         .Skip(index % size * size)  // X coordinates 0..2, 3..5, 6..8
         .Take(size))
         .ToArray()
      .ToArray())
    .ToArray(); // final materialization into char[][][] (if required)
  string report = string.Join(Environment.NewLine + Environment.NewLine, grids
    .Select(cell => string.Join(Environment.NewLine, cell
       .Select(line => string.Join(" ", line)))));

  Console.WriteLine(report);
. . .
. . 6
. . .

1 4 .
. . .
. . .

. 2 .
. . .
. . .

. . 1
. 6 7
. . .

. . .
. . .
. . .

. . .
. . 9
8 1 .

. 3 .
. . .
. . .

. . .
. . 7
5 . .

. . 6
. . .
. 7 .