Преобразование многомерного массива в зубчатый массив в C #

У меня есть веб-сервис C # WCF, который вызывается двумя проектами VB 6. Целевой проект VB отправляет клиентскому проекту VB многомерный массив.

Я хочу преобразовать многомерный массив в зубчатый массив, но мне не повезло.

Как я могу найти количество элементов в моем объекте [,], чтобы иметь возможность инициализировать массив с зазубринами?

Я хочу следовать ответу из этого вопроса, но я не На моем объекте нет GetLength метода.

Я пытался :

int firstElement = astrManTfrLetters.GetLength(0);
int secondElement = astrManTfrLetters.GetLength(1);

И я застрял здесь.


person sebastian.roibu    schedule 24.02.2014    source источник
comment
Покажите нам, какой у вас код на данный момент.   -  person RononDex    schedule 24.02.2014
comment
Итак, очевидно, что полученный объект не является массивом. Что это? Вы пробовали его кастовать? Почтовый индекс.   -  person Hans Passant    schedule 24.02.2014
comment
if (astrManTfrLetters.GetType (). ToString (). Equals (System.Object [,])) {объект [,] tempAstrManTfrLetters = astrManTfrLetters как объект [,]; }   -  person sebastian.roibu    schedule 24.02.2014


Ответы (3)


Обычно представленные решения предполагают индексы на основе 0, но это не всегда так, в основном, если на клиенте вы имеете дело с object[,] для Microsoft Excel.

Вот решение для любых индексов:

internal static class ExtensionMethods
{
    internal static T[][] ToJaggedArray<T>(this T[,] twoDimensionalArray)
    {
        int rowsFirstIndex = twoDimensionalArray.GetLowerBound(0);
        int rowsLastIndex = twoDimensionalArray.GetUpperBound(0);
        int numberOfRows = rowsLastIndex + 1;

        int columnsFirstIndex = twoDimensionalArray.GetLowerBound(1);
        int columnsLastIndex = twoDimensionalArray.GetUpperBound(1);
        int numberOfColumns = columnsLastIndex + 1;

        T[][] jaggedArray = new T[numberOfRows][];
        for (int i = rowsFirstIndex; i <= rowsLastIndex; i++)
        {
            jaggedArray[i] = new T[numberOfColumns];

            for (int j = columnsFirstIndex; j <= columnsLastIndex; j++)
            {
                jaggedArray[i][j] = twoDimensionalArray[i, j];
            }
        }
        return jaggedArray;
    }
}
person Pedro    schedule 23.09.2014

По умолчанию C # создает массив, начинающийся с 0. Я точно настроил решение Педро, как показано ниже:

internal static class ExtensionMethods
{
    internal static T[][] ToJaggedArray<T>(this T[,] twoDimensionalArray)
    {
        int rowsFirstIndex = twoDimensionalArray.GetLowerBound(0);
        int rowsLastIndex = twoDimensionalArray.GetUpperBound(0);
        int numberOfRows = rowsLastIndex - rowsFirstIndex + 1;

        int columnsFirstIndex = twoDimensionalArray.GetLowerBound(1);
        int columnsLastIndex = twoDimensionalArray.GetUpperBound(1);
        int numberOfColumns = columnsLastIndex - columnsFirstIndex + 1;

        T[][] jaggedArray = new T[numberOfRows][];
        for (int i = 0; i < numberOfRows; i++)
        {
            jaggedArray[i] = new T[numberOfColumns];

            for (int j = 0; j < numberOfColumns; j++)
            {
                jaggedArray[i][j] = twoDimensionalArray[i + rowsFirstIndex, j + columnsFirstIndex];
            }
        }
        return jaggedArray;
    }
}
person Ray Chen    schedule 21.08.2017

Это сработало для меня и не потребовало никаких циклов. Он взял объект [85000,26] и преобразовал его в объект [85000] [26] чуть более чем за секунду.

object[,] obj2D = ...

// Take my 2D array and cast it as a 1D array
object[] obj1D = ((object[,]) obj2D).Cast<object>().ToArray();

// using linq, chunk the 1D array back into a jagged array
Int32 j = 0;
object[][] jagged = obj1D.GroupBy(x => j++ / obj2D.GetLength(1)).Select(y => y.ToArray()).ToArray();
person Kevin M    schedule 12.04.2018