Существует ли более производительный способ связать 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;
}
Вместо этого вы можете использовать связанный список int []
, поэтому вам не нужно повторно выделять новую память.
См. LinkedList
, или если он работает не так, как вы хотите для concat, вы можете легко создать свой собственный.
Ваш вопрос можно упростить до того же вопроса, что и этот .
Я могу предложить вам следующее:
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).
Я сомневаюсь, что это будет намного быстрее, но, возможно, это будет немного читабельнее:
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 []: (