Конкатенация массива C # 2d - PullRequest
5 голосов
/ 07 июля 2010

Есть ли более эффективный способ объединения 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;    



    }

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

        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 ]

3 голосов
/ 07 июля 2010

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

Так что мое решение для вас будет:

    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 голосов
/ 07 июля 2010

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

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

0 голосов
/ 07 июля 2010

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

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

...