Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# 如何裁剪二维阵列的分段?_C#_Arrays_Multidimensional Array - Fatal编程技术网

C# 如何裁剪二维阵列的分段?

C# 如何裁剪二维阵列的分段?,c#,arrays,multidimensional-array,C#,Arrays,Multidimensional Array,我有一个声明为新字节[w,h]的2D数组。我想在给定坐标(x1,y1)-(x2,y2)的情况下裁剪出这个数组的一个子部分。最快的方法是什么?有什么方法可以“切片”二维阵列吗?我想不出更快的方法,但您可以使用两个嵌套循环: byte[,] array2 = new byte[x2 - x1, y2 - y1]; for (int i = x1; i < x2; i++) { for (int j = y1; j < y2; j++) { array2[i

我有一个声明为
新字节[w,h]
的2D数组。我想在给定坐标
(x1,y1)
-
(x2,y2)
的情况下裁剪出这个数组的一个子部分。最快的方法是什么?有什么方法可以“切片”二维阵列吗?

我想不出更快的方法,但您可以使用两个嵌套循环:

byte[,] array2 = new byte[x2 - x1, y2 - y1];
for (int i = x1; i < x2; i++)
{
    for (int j = y1; j < y2; j++)
    {
        array2[i-x1, j-y1] = array[i, j];
    }
}
byte[,]array2=新字节[x2-x1,y2-y1];
对于(int i=x1;i
对于锯齿状数组,可以使用linq查询:

IEnumerable<byte> x = array3.Skip(x1)
                            .Take(x2-x1)
                            .SelectMany(a => a.Skip(y1).Take(y2-y1));
IEnumerable x=array3.跳过(x1)
.取(x2-x1)
.SelectMany(a=>a.Skip(y1).Take(y2-y1));
您可以使用:

intw2=x2-x1+1;
int h2=y2-y1+1;
字节[,]array2=新字节[w2,h2];
对于(int i=0;i

对于大型阵列,这可能更快。不过,这两个嵌套循环更具可读性。

切片可以环绕阵列边缘。i、 (2,2)=>(1,2)有效吗?@steaks:否。裁剪区域将始终位于原始字节数组内。最坏的情况是它的大小完全相同:(0,0)到(w-1,h-1)。因为它是一个
数组
,或者你可以使用
矩阵
?@WiiMaxx:我可以使用矩阵。我只是在给X,Y coords读写。我不知道.NET有一个矩阵类。你会用什么方法提取一个区域?@马克,我想你已经得到了你所需要的一切。我想也许我们可以使用某种内存流来同时复制块。哦,好吧,现在就这样吧。谢谢:-)是的,我想有。我希望这不是最好的答案。
int w2 = x2 - x1 + 1;
int h2 = y2 - y1 + 1;
byte[,] array2 = new byte[w2, h2];
for (int i = 0; i < w2; i++)
{
    Array.Copy(array1, (i+x1)*h + y1, array2, i*h2, h2);
}