2010-07-07 11 views
4

Existe-t-il un moyen plus performant de concaténer les tableaux 2-d que celui-ci?C# 2-d array concaténation

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;  



    } 

Edit: Je voudrais savoir si c'est une bonne pratique de la concat profonde du tableau 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; 

    } 
+2

Avez-vous identifié cela comme quelque chose qui prend beaucoup de temps de traitement? Si ce n'est pas le cas, laissez-le tranquille jusqu'à ce qu'il le fasse. – ChrisF

+0

Quelle est la performance de la méthode existante? –

+0

la chose est que je vais incorporer ceci à un code très critique et selon mes résultats de test, il fonctionne bien dans la gamme acceptable, je veux juste m'assurer qu'il est le meilleur que je peux faire – mustafabar

Répondre

3

Vous pouvez utiliser une liste chaînée de int[] à la place de sorte que vous n'avez pas besoin réallouer toute nouvelle mémoire.

Voir LinkedList<T>, ou s'il ne fonctionne pas exactement comme vous le souhaitez pour la concaténation, vous pouvez facilement créer le vôtre.

0

Je doute que ce sera beaucoup plus rapide, mais peut-être il est un peu plus lisible:

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

Edit: dans une partie critique de votre application, il pourrait valoir la peine - il est dommage Buffer.BlockCopy doesn . « t travailler sur "imbriquées" int [] tableaux :(

2

Votre problème peut être simplifié à la même question que this one

donc ma solution pour vous serait:

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

     array1.CopyTo(result, 0); 
     array2.CopyTo(result, array1.Length); 

     return result; 
    } 

** Je ne trouve pas le lien de commentaire ci-dessous la question originale. Donc, éditer mon propre post. *

Mustafa, je voudrais vous demander: Avez-vous l'intention de copier des tableaux dans une nouvelle mémoire? Parce que votre méthode de concat d'origine ne copie que les références de tableau. Donc, après avoir créé array3 (en utilisant original concat()), si vous changez quelque chose dans array1 et array2, alors array3 changera aussi. J'espère que vous êtes au courant de cela. Si vous aviez l'intention d'avoir un bloc de mémoire séparé pour array3, alors utilisez seulement ma méthode (ou la méthode de deltreme).

+0

non .. le copyto copie également références .. vérifiez cela int [] [] array1 = {nouvel int [] {1, 2, 3}, nouvel int [] {4, 5, 6}, nouvel int [] {7, 8, 9} } int [] [] array3 = nouvel int [array1.Length] []; array1.CopyTo (array3,0); array1 [0] [0] = 1000; if (tableau1 [0] [0] == tableau3 [0] [0]) Console.WriteLine ("Gotcha"); – mustafabar

+0

Oh wow. Merci Mustafa, de me l'avoir fait savoir. J'ai aussi appris quelque chose. Atleast dans ce cas, cette solution s'adapte parfaitement à vos besoins. Parce que vous ne vous êtes pas soucié de copier des références. – bits