2009-05-20 50 views

Respuesta

17

asignar espacio para la matriz de destino, que utilizan Array.CopyTo():

targetArray = new string[sourceArray.Length]; 
sourceArray.CopyTo(targetArray, 0); 
+4

Usando Clone() hace este caso particular, una sola línea sin embargo. –

27
  • Para crear una nueva matriz con el mismo contenido (como una copia superficial): llaman Array.Clone y simplemente echados el resultado.
  • Para copiar una parte de una matriz de cadenas en otra matriz de cadenas: llaman Array.Copy o Array.CopyTo

Por ejemplo:

using System; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     // Clone the whole array 
     string[] args2 = (string[]) args.Clone(); 

     // Copy the five elements with indexes 2-6 
     // from args into args3, stating from 
     // index 2 of args3. 
     string[] args3 = new string[5]; 
     Array.Copy(args, 2, args3, 0, 5); 

     // Copy whole of args into args4, starting from 
     // index 2 (of args4) 
     string[] args4 = new string[args.Length+2]; 
     args.CopyTo(args4, 2); 
    } 
} 

Suponiendo partimos de args = { "a", "b", "c", "d", "e", "f", "g", "h" } los resultados son los siguientes:

args2 = { "a", "b", "c", "d", "e", "f", "g", "h" } 
args3 = { "c", "d", "e", "f", "g" } 
args4 = { null, null, "a", "b", "c", "d", "e", "f", "g", "h" } 
+0

Hola Jon, ¿por qué clonar array array es un clon 'profundo'? Quiero decir, sé que Array.Clone() es una copia superficial; si bien realiza una copia superficial en otros tipos de referencia (por ejemplo, CultureInfo), de alguna manera realiza una copia "profunda" en el conjunto de cadenas. Por ejemplo, si clono una matriz que contenga "Hola", "Mundo"; después del clon, configuro el primer elemento como nulo. Entonces espero que el primer elemento de la matriz clonada también sea nulo, pero sigue siendo Hello. Espero que sepas a qué me refiero sin poder mostrar la muestra del código en el comentario. – stt106

+0

@ stt106: ¿Por qué esperas que sea nulo? Está creando una copia superficial, es decir, creando una nueva matriz del mismo tamaño y copiando cada valor de la matriz original a la nueva matriz. Verás exactamente el mismo comportamiento con 'CultureInfo'. –

+0

Pero las referencias en la nueva matriz apuntan a los ** mismos ** objetos a los que apuntan las referencias en la matriz original; por lo tanto, si se modifica la matriz original o la clonada (nueva), ¿la otra matriz debe ** reflejar también la modificación **? – stt106

0

Las respuestas anteriores muestran un clon superficial; así que pensé en agregar un ejemplo de clonación profunda utilizando la serialización; por supuesto, también se puede hacer un clon profundo al recorrer la matriz original y copiar cada elemento en una nueva matriz.

private static T[] ArrayDeepCopy<T>(T[] source) 
     { 
      using (var ms = new MemoryStream()) 
      { 
       var bf = new BinaryFormatter{Context = new StreamingContext(StreamingContextStates.Clone)}; 
       bf.Serialize(ms, source); 
       ms.Position = 0; 
       return (T[]) bf.Deserialize(ms); 
      } 
     } 

Prueba de la clon profundo:

private static void ArrayDeepCloneTest() 
     { 
      //a testing array 
      CultureInfo[] secTestArray = { new CultureInfo("en-US", false), new CultureInfo("fr-FR") }; 

      //deep clone 
      var secCloneArray = ArrayDeepCopy(secTestArray); 

      //print out the cloned array 
      Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator)); 

      //modify the original array 
      secTestArray[0].DateTimeFormat.DateSeparator = "-"; 

      Console.WriteLine(); 
      //show the (deep) cloned array unchanged whereas a shallow clone would reflect the change... 
      Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator)); 
     } 
Cuestiones relacionadas