繁体   English   中英

在 C# 中将多维数组转换为锯齿状数组

[英]Convert multidimensional array to jagged array in C#

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

我想将多维数组转换为锯齿状数组,但我没有运气。

我怎样才能在我的对象 [,] 中找到能够初始化锯齿状数组的元素数量?

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

我试过 :

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

而我卡在这里。

通常,提出的解决方案假定基于 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;
    }
}

默认情况下,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;
    }
}

这对我有用,不需要任何循环。 它需要一个对象 [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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM