C# 将网格n*m拆分为子网格a*b
有一个9*9的网格,我想把它分成9个3*3的网格。 以下是我的有效解决方案: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
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 .