在C#中将多维数组转换为交错数组

14

我有一个C# WCF webservice,被两个VB 6项目调用。目标VB项目向客户端VB项目发送多维数组。

我想将这个多维数组转换为锯齿形数组,但是一直没有成功。

如何找到我的object[,]中元素的数量,以便初始化锯齿形数组?

我想遵循这个问题中的答案,但我的对象上没有GetLength方法。

我尝试过:

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

我被困在这里。


2
请展示一下你目前的代码。 - RononDex
1
所以,显然,你拥有的对象不是一个数组。它是什么?你尝试过强制转换吗?发布代码。 - Hans Passant
如果 (astrManTfrLetters.GetType().ToString().Equals("System.Object[,]")) { object[,] tempAstrManTfrLetters = astrManTfrLetters as object[,]; } - sebastian.roibu
3个回答

21
通常情况下,所提供的解决方案假定为从0开始的索引,但这并不总是适用的,特别是当你在处理Microsoft Excel的object[,]时。以下是适用于任何索引的解决方案:
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;
    }
}

3

这对我很有用,而且不需要任何循环。它在一秒钟内将一个对象[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();

3

默认情况下,C#生成从0开始的数组。 我已经对Pedro的解决方案进行了微调,如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接