如何裁剪2D阵列的分段?

时间:2013-05-21 03:16:34

标签: c# arrays multidimensional-array

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

2 个答案:

答案 0 :(得分:1)

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

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

对于锯齿状数组,您可以使用linq查询:

IEnumerable<byte> x = array3.Skip(x1)
                            .Take(x2-x1)
                            .SelectMany(a => a.Skip(y1).Take(y2-y1));

答案 1 :(得分:1)

您可以使用Array.Copy

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

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