Wie kann ich ein string[]
von einem anderen string[]
kopieren?Ein String-Array in ein anderes kopieren
Angenommen, ich habe string[] args
. Wie kann ich es in ein anderes Array kopieren string[] args1
?
Wie kann ich ein string[]
von einem anderen string[]
kopieren?Ein String-Array in ein anderes kopieren
Angenommen, ich habe string[] args
. Wie kann ich es in ein anderes Array kopieren string[] args1
?
Ordnen Sie Platz für das Ziel-Array, das Array.CopyTo() verwenden:
targetArray = new string[sourceArray.Length];
sourceArray.CopyTo(targetArray, 0);
Array.Clone
und nur werfen das Ergebnis.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" }
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
@ 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. –
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
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));
}
Clone Mit() macht diesen besonderen Fall einen Einzeiler though. –