Самый быстрый способ преобразовать T [,] в T [] []?

Итак оказывается , что все массивы не созданы равными. Многомерные массивы могут иметь ненулевые нижние границы. См., Например, свойство Range.Value Excel PIA , объект [,] rectData = myRange.Value;

Мне нужно преобразовать эти данные в массив с зубцами. Моя первая попытка ниже пахнет сложностью. Есть предложения по его оптимизации? Он должен обрабатывать общий случай, когда нижняя граница может отличаться от нуля.

У меня есть этот ex-метод:

    public static T[][] AsJagged( this T[,] rect )
    {
        int row1 = rect.GetLowerBound(0);
        int rowN = rect.GetUpperBound(0);
        int col1 = rect.GetLowerBound(1);
        int colN = rect.GetUpperBound(1);

        int height = rowN - row1 + 1;
        int width = colN - col1 + 1;
        T[][] jagged = new T[height][];

        int k = 0;
        int l;
        for ( int i = row1; i < row1 + height; i++ )
        {
            l = 0;
            T[] temp = new T[width];
            for ( int j = col1; j < col1 + width; j++ )
                temp[l++] = rect[i, j];
            jagged[k++] = temp;
        }

        return jagged;
    }

Используется так:

    public void Foo()
    {
        int[,] iRect1 = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
        int[][] iJagged1 = iRect1.AsJagged();

        int[] lengths = { 3, 5 };
        int[] lowerBounds = { 7, 8 };
        int[,] iRect2 = (int[,])Array.CreateInstance(typeof(int), lengths, lowerBounds);
        int[][] iJagged2 = iRect2.AsJagged();

    }

Любопытно, будет ли Buffer.BlockCopy () работать или быть быстрее?

Изменить: AsJagged необходимо обрабатывать ссылочные типы.

Edit: обнаружена ошибка в AsJagged (). Добавлен int l ; и добавил во внутренний цикл col1 + width .

8
задан Community 23 May 2017 в 10:30
поделиться