【问题标题】:Convert multidimensional array to jagged array in C#在C#中将多维数组转换为交错数组
【发布时间】:2014-03-26 01:34:04
【问题描述】:

我有一个由两个 VB 6 项目调用的 C# WCF web 服务。目标 VB 项目正在向客户端 VB 项目发送一个多维数组。

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

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

我想关注this question 的答案,但我的对象上没有GetLength 方法。

我试过了:

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

我被困在这里。

【问题讨论】:

  • 向我们展示您目前拥有的代码。
  • 所以,很明显,你得到的对象不是一个数组。它是什么?你试过铸造它吗?邮政编码。
  • if (astrManTfrLetters.GetType().ToString().Equals("System.Object[,]")) { object[,] tempAstrManTfrLetters = asrManTfrLetters as object[,]; }

标签: c# multidimensional-array jagged-arrays


【解决方案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;
    }
}

【讨论】:

    【解决方案2】:

    这对我有用,不需要任何循环。它需要一个 object[85000,26] 并在一秒多一点的时间内将其转换为 object[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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2019-06-29
        相关资源
        最近更新 更多