2009-05-20 18 views

risposta

17

allocare lo spazio per l'array di destinazione, che utilizzano Array.CopyTo():

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

Utilizzando Clone() rende questo caso particolare una battuta però. –

27
  • Per creare un nuovo array con lo stesso contenuto (come una copia): chiamata Array.Clone e appena gettati il risultato.
  • Per copiare una porzione di una matrice di stringhe in un'altra matrice di stringhe: nomina Array.Copy o Array.CopyTo

Ad esempio:

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

Supponendo iniziamo con args = { "a", "b", "c", "d", "e", "f", "g", "h" } i risultati sono:

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

Ciao Jon, perché lo string array clona un clone "profondo"? Voglio dire, so che Array.Clone() è una copia superficiale; mentre fa una copia superficiale su altri tipi di riferimento (ad esempio CultureInfo), in qualche modo esegue una copia "profonda" sull'array di stringhe. Ad esempio, se clonato un array contenente "Hello", "World"; dopo il clone, ho impostato il primo elemento su null. Quindi prevedo che anche il 1 ° elemento dell'array clonato debba essere nullo ma è ancora Hello. Spero tu sappia cosa intendo senza poter mostrare il codice di esempio nel commento. – stt106

+0

@ stt106: Perché dovresti aspettarti che sia nullo? Sta creando una copia superficiale, ovvero creando un nuovo array della stessa dimensione e copiando ciascun valore dall'array originale al nuovo array. Vedresti esattamente lo stesso comportamento con 'CultureInfo'. –

+0

Ma i riferimenti nel nuovo array puntano agli ** stessi ** oggetti a cui puntano i riferimenti nell'array originale; quindi se l'array originale o clonato (nuovo) viene modificato allora l'altro array dovrebbe ** riflettere anche la modifica **? – stt106

0

Le risposte precedenti mostrano un clone superficiale; quindi ho pensato di aggiungere un esempio di clone profondo usando la serializzazione; ovviamente un clone profondo può anche essere fatto scorrendo attraverso l'array originale e copiare ogni elemento in un nuovo array.

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

Testare il clone profonda:

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)); 
     } 
Problemi correlati