代码之家  ›  专栏  ›  技术社区  ›  mustafabar

C#2-d数组串联

  •  5
  • mustafabar  · 技术社区  · 16 年前

      static void Main(string[] args)
        {
    
            int[][] array1 = { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } } ;             
    
            int[][] array2 = { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };
    
            int[][] array3 = Concat(array1, array2);
    
        }
    
        private static int[][] Concat(int[][] array1, int[][] array2)
        {
            int array1Length = array1.Length;
            int array2Length = array2.Length;
    
            int[][] result = new int[array1Length + array2Length][];
            int i = 0;
            for (; i < array1Length; i++)
                result[i] = array1[i];
    
            for (; i < array2Length + array1Length; i++)
                result[i] = array2[i - array1Length];
    
            return result;    
    
    
    
        }
    

    编辑:

            private static int[][] DeepConcat(int[][] array1, int[][] array2)
        {
            int array1Length = array1.Length;
            int array2Length = array2.Length;
    
            int[][] result = new int[array1Length + array2Length][];
            int i = 0;
            for (; i < array1Length; i++)
            {
                result[i] = new int[array1[i].Length];
                for (int j = 0; j < array1[i].Length; j++)
                {
                    result[i][j] = array1[i][j];
                }
            }
            for (; i < array2Length + array1Length; i++)
            {
                result[i] = new int[array2[i - array1Length].Length];
                for (int j = 0; j < array2[i - array1Length].Length; j++)
                {
                    result[i][j] = array2[i - array1Length][j];
                }
    
            }
            return result;
    
        }
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Brian R. Bondy    16 年前

    你可以用一个 int[] 相反,您不需要重新分配任何新内存。

    LinkedList<T> ,或者如果它没有完全按照你想要的concat执行,你可以轻松地制作自己的。

        2
  •  3
  •   MoonKnight    8 年前

    你的问题可以简化成和你的问题一样的问题 this one .

    所以我的解决方案是:

        private static int[][] Concat(int[][] array1, int[][] array2)
        {
            int[][] result = new int[array1.Length + array2.Length][];
    
            array1.CopyTo(result, 0);
            array2.CopyTo(result, array1.Length);
    
            return result;
        }
    

    穆斯塔法,我想问你:你打算在新内存中复制数组吗? 因为原来的concat方法只复制数组引用。因此,在创建array3(使用original concat())之后,如果您更改了array1和array2中的任何内容,那么array3也将更改。我希望你知道这一点。

        3
  •  0
  •   C.Evenhuis    16 年前

    我怀疑这会快得多,但也许它更具可读性:

    int[][] array3 = new int[array1.Length + array2.Length][];
    
    Array.Copy(array1, 0, array3, 0, array1.Length);
    Array.Copy(array2, 0, array3, array1.Length, array2.Length);