【问题标题】:C# 2-d array concatenationC# 二维数组连接
【发布时间】:2010-07-07 13:56:26
【问题描述】:

还有比这更高效的连接二维数组的方法吗?

  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;

    }

【问题讨论】:

  • 您是否认为这会占用您大量的处理时间?如果没有,请不要理会它。
  • 现有方法的性能如何?
  • 问题是我将把它合并到一个非常关键的代码中,根据我的测试结果,它在可接受的范围内表现良好,我只是想确保它是我能做的最好的

标签: c# copy concatenation multidimensional-array


【解决方案1】:

您可以改用int[] 的链表,这样您就不需要重新分配任何新内存。

请参阅 LinkedList&lt;T&gt;,或者如果 concat 的性能与您的要求不完全一样,您可以轻松地自己制作。

【讨论】:

    【解决方案2】:

    您的问题可以简化为与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;
        }
    

    **我在原始问题下方找不到评论链接。所以编辑我自己的帖子。*

    Mustafa,我想问你:你打算将数组复制到新内存中吗? 因为你原来的 concat 方法只复制数组引用。所以在创建array3(使用原始的concat())之后,如果你改变array1和array2中的任何东西,那么array3也会改变。我希望你意识到这一点。 如果您打算为 array3 设置单独的内存块,则只能使用我的方法(或 deltreme 的方法)。

    【讨论】:

    • no .. copyto 也复制了引用 .. 检查一下 int[][] array1 = { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, 新的 int[] { 7, 8, 9 } } ; int[][] array3 = new int[array1.Length][]; array1.CopyTo(array3,0);数组1[0][0] = 1000; if (array1[0][0] == array3[0][0]) Console.WriteLine("Gotcha");
    • 哇哦。谢谢穆斯塔法,让我知道这件事。我也学到了一些东西。至少在这种情况下,该解决方案完全适合您的要求。因为你不在乎复制引用。
    【解决方案3】:

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

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

    编辑:在您的应用程序的关键部分,这可能是值得的 - 可惜 Buffer.BlockCopy 不适用于“嵌套” int[] 数组:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多