C# 2-я конкатенация массива

Существует ли более производительный способ связать 2-е массивы, чем это?

  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;    



    }

Править: Я хотел бы знать, является ли это хорошей практикой глубокого concat 2-го массива

        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;

    }
5
задан mustafabar 8 July 2010 в 10:15
поделиться

3 ответа

Вместо этого вы можете использовать связанный список int [] , поэтому вам не нужно повторно выделять новую память.

См. LinkedList , или если он работает не так, как вы хотите для concat, вы можете легко создать свой собственный.

3
ответ дан 14 December 2019 в 13:25
поделиться

Ваш вопрос можно упростить до того же вопроса, что и этот .

Я могу предложить вам следующее:

    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 (с использованием исходной concat ()), если вы измените что-либо в array1 и array2, то также изменится array3. Надеюсь, вы об этом знаете. Если вы намеревались иметь отдельный блок памяти для array3, используйте только мой метод (или метод deltreme).

3
ответ дан 14 December 2019 в 13:25
поделиться

Я сомневаюсь, что это будет намного быстрее, но, возможно, это будет немного читабельнее:

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 []: (

0
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: