2009-05-20 16 views

Antwort

17

Ordnen Sie Platz für das Ziel-Array, das Array.CopyTo() verwenden:

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

Clone Mit() macht diesen besonderen Fall einen Einzeiler though. –

27
  • Um ein völlig neues Array mit dem gleichen Inhalt (als flache Kopie) zu erstellen: rufen Array.Clone und nur werfen das Ergebnis.
  • Um einen Teil eines String-Array in eine andere Zeichenfolge Array zu kopieren:

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

    Unter der Annahme, beginnen wir mit args = { "a", "b", "c", "d", "e", "f", "g", "h" } die Ergebnisse sind: Array.Copy oder Array.CopyTo

Zum Beispiel rufen

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

Hallo Jon, warum ist String-Array-Klon ein "tiefer" Klon? Ich meine, ich kenne Array.Clone() ist eine flache Kopie; während es eine flache Kopie auf anderen Referenztypen (z. B. CultureInfo) macht, macht es irgendwie eine "tiefe" Kopie auf String-Array. Zum Beispiel, wenn ich ein Array klonen, das "Hallo", "Welt" enthält; Nach dem Klon habe ich das erste Element auf null gesetzt. Dann erwarte ich, dass das erste Element des geklonten Arrays ebenfalls null ist, aber es ist immer noch Hello. Ich hoffe, Sie wissen, was ich meine, ohne das Codebeispiel im Kommentar anzeigen zu können. – stt106

+0

@ stt106: Warum sollten Sie erwarten, dass es null ist? Es wird eine flache Kopie erstellt, d. H. Ein neues Array derselben Größe erstellt und jeder Wert vom ursprünglichen Array in das neue Array kopiert. Mit "CultureInfo" würden Sie genau dasselbe Verhalten sehen. –

+0

Die Referenzen im neuen Array verweisen jedoch auf die ** gleichen ** Objekte, auf die die Referenzen im ursprünglichen Array zeigen; Wenn also entweder das ursprüngliche oder das geklonte (neue) Array modifiziert wird, sollte das andere Array ** ebenfalls die Modifikation ** widerspiegeln? – stt106

0

Die obigen Antworten zeigen einen flachen Klon; Also dachte ich mir, dass ich ein tiefes Klon-Beispiel mit Serialisierung hinzufügen würde; natürlich kann ein tiefer Klon auch gemacht werden, indem man das ursprüngliche Array durchläuft und jedes Element in ein brandneues Array kopiert.

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

den tiefen Klon Test:

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