2012-03-29 6 views
9

zu erstellen und ein Array mit einem anderen Array initialisieren ich dies derzeit tun:Wie erstellt und initialisiert man ein Array mit einem anderen Array?

void Foo(int[] a) 
{ 
    int[] b = new int[ a.Length ]; 
    for (int i = 0; i < a.Length; ++i) 
     b[ i ] = a[ i ]; 

    // Other code ... 
} 

Gibt es einen kürzeren oder mehr idiomatischen Weg, dies in C# zu tun?

Es wird groß sein, wenn dies in einer einzigen Anweisung, wie in C++ erfolgen:

vector<int> b(a); 

dies kann nicht in einer einzigen Anweisung erfolgen Wenn ich nehme, was ich kriegen :-)

+2

Könnten Sie nicht nur verwenden 'Array.Copy'? –

+0

sollte eine Möglichkeit sein, den gesamten Speicher direkt zu kopieren ... in C++ http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-of-elements-from-an-array –

+0

http: // Stapelüberlauf.com/questions/5655553/whats-the-most-effiziente-Weg-zu-kopieren-Elemente-von-ac-sharp-multidimensional-arr –

Antwort

12

ich mag mit LINQ für diesen:

int[] b = a.ToArray(); 

Davon abgesehen, hat Array.Copy bessere Leistung, wenn dies in einer engen Schleife, etc. verwendet werden:

int[] b = new int[a.Length]; 
Array.Copy(a, b, a.Length); 

Edit:

Es wird groß sein, wenn dies in einer einzigen Anweisung, wie in C++ erfolgen:

Vektor b (a);

Die C# Version davon wäre:

List<int> b = new List<int>(a); 

List<T> ist C# 's entspricht std::vector<T>. Die constructor above funktioniert mit jedem IEnumerable<T>, einschließlich eines anderen List<T>, ein Array (T[]) usw.

+0

+1 - Ich dachte nie LINQ dafür. Schöne Lösung! –

6

Verwenden Array.Copy ein Array

 int[] source = new int[5]; 
    int[] target = new int[5]; 
    Array.Copy(source, target, 5); 
1

auch kopieren Sie die Standard Clone() Funktion versuchen, die von der IClonable Schnittstelle implementiert wird.

int[] b = a.Clone() as int[]; 
1

Clone() und ToArray() sind syntaktisch nett, weil Sie brauchen, um eine Ziel-Array nicht vorbelegt, aber in Bezug auf Leistung, Array.Copy() ist die schnellste Methode (Einschränkung siehe unten).

Der Grund dafür, dass Array.Copy() so schnell ist, ist, dass es keinen Speicher reserviert. Wenn Ihre Arrays jedoch jedes Mal in eine neue Speicherregion kopiert werden müssen, ist Array.Copy() nicht mehr die schnellste Methode.

Hier sind meine Leistung Ergebnisse:

Copy: 0 ms 
Copy (with allocation): 449 ms 
Clone: 323 ms 
ToArray: 344 ms 

Und hier ist der Code, den ich verwendet:

const int arrayLength = 100000; 
const int numberCopies = 1000; 
var a = new int[arrayLength]; 
var b = new int[arrayLength]; 

var stopwatch = new Stopwatch(); 
for (var i = 0; i < numberCopies; i++) { 
    Array.Copy(a, b, arrayLength); 
} 
Console.WriteLine($"Copy: {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    var c = new int[arrayLength]; 
    Array.Copy(a, c, arrayLength); 
} 
Console.WriteLine($"Copy (with allocation): {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    b = (int[]) a.Clone(); 
} 
Console.WriteLine($"Clone: {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    b = a.ToArray(); 
} 
Console.WriteLine($"ToArray: {stopwatch.ElapsedMilliseconds} ms"); 
Verwandte Themen