2012-03-29 18 views
9

per creare e inizializzare una matrice con un altro array Io attualmente faccio:Come creare e inizializzare una matrice con un'altra matrice?

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

    // Other code ... 
} 

C'è un modo più breve o più idiomatica di fare questo in C#?

Sarà grande se questo può essere fatto in una singola istruzione, come in C++:

vector<int> b(a); 

Se ciò non può essere fatto in una singola istruzione, mi prenderò quello che ottengo :-)

+2

Impossibile basta usare 'Array.Copy'? –

+0

dovrebbe essere un modo per copiare tutta la memoria direttamente ... in C++ http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-of-elements-from-an-array –

+0

http: // StackOverflow.it/questions/5655553/whats-the-most-efficient-way-to-copy-elements-of-ac-sharp-multidimensionale-arr –

risposta

12

mi piace usare LINQ per questo:

int[] b = a.ToArray(); 

detto questo, Array.Copy ha prestazioni migliori, se questo sarà usato in un loop stretto, ecc:

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

Edit:

Sarà grande se questo può essere fatto in una singola istruzione, come in C++:

vettore b (a);

La versione C# di questo potrebbe essere:

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

List<T> è 's equivale a std::vector<T> C#. Le constructor above funziona con qualsiasi IEnumerable<T>, tra cui un altro List<T>, un array (T[]), ecc

+0

+1 - Non ho mai considerato LINQ per questo. Bella soluzione! –

6

Usa Array.Copy per copiare un array

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

correlate la funzione predefinita Clone() che viene implementato dall'interfaccia IClonable.

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

Clone() e ToArray() sono sintatticamente bello perché non è necessario pre-allocare una matrice di destinazione, ma in termini di prestazioni, Array.Copy() è il metodo più veloce (vedi avvertimento di seguito).

Il motivo per cui Array.Copy() è così veloce è che non alloca memoria. Tuttavia, se si richiede che gli array vengano copiati in una nuova area di memoria ogni volta, quindi Array.Copy() non è più il metodo più veloce.

Qui ci sono i miei risultati di performance:

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

Ed ecco il codice che ho usato:

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