2012-03-29 39 views
9

Để tạo và khởi tạo một mảng với một mảng Tôi hiện làm điều này:Làm thế nào để tạo và khởi tạo một mảng với mảng khác?

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ó cách nào ngắn hơn hoặc nhiều thành ngữ để làm điều này trong C#?

Nó sẽ là tuyệt vời nếu điều này có thể được thực hiện trong một tuyên bố duy nhất, như trong C++:

vector<int> b(a); 

Nếu điều này không thể được thực hiện trong một tuyên bố duy nhất, tôi sẽ mất những gì tôi nhận được :-)

+2

Không thể bạn chỉ cần sử dụng 'Array.Copy'? –

+0

phải là cách để sao chép tất cả bộ nhớ trực tiếp ... trong C++ http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-of-elements-from-an-array –

+0

http: // stackoverflow.com/questions/5655553/whats-the-most-effective-to-copy-elements-of-ac-sắc nét-đa chiều-arr –

Trả lời

12

tôi thích sử dụng LINQ cho việc này:

int[] b = a.ToArray(); 

Điều đó đang được nói, Array.Copy không có hiệu suất tốt hơn, nếu điều này sẽ được sử dụng trong một vòng lặp chặt chẽ, vv:

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

Edit:

Nó sẽ là tuyệt vời nếu điều này có thể được thực hiện trong một tuyên bố duy nhất, như trong C++:

vector b (a);

CáC# phiên bản C này sẽ là:

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

List<T> là C# 's tương đương với std::vector<T>. Các constructor above làm việc với bất kỳ IEnumerable<T>, bao gồm List<T> khác, một mảng (T[]) vv

+0

+1 - Tôi chưa bao giờ coi LINQ cho điều này. Giải pháp tốt! –

6

Sử dụng Array.Copy để sao chép một mảng

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

Cũng thử chức năng mặc định Clone() được thực hiện từ giao diện IClonable.

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

Clone() và ToArray() là cú pháp tốt đẹp bởi vì bạn không cần tiền phân bổ một mảng đích, nhưng về hiệu suất, Array.Copy() là phương pháp nhanh nhất (xem báo trước bên dưới).

Lý do cho Array.Copy() quá nhanh đến nỗi nó không cấp phát bộ nhớ. Tuy nhiên, nếu bạn yêu cầu mảng của bạn được sao chép vào một vùng bộ nhớ mới mỗi lần, thì Array.Copy() không còn là phương thức nhanh nhất.

Dưới đây là kết quả thực hiện của tôi:

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

Và đây là đoạn code tôi sử dụng:

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"); 
Các vấn đề liên quan