2012-03-29 15 views
9

Aby utworzyć i zainicjować tablicę z innej tablicy I obecnie to zrobić:Jak utworzyć i zainicjować tablicę z inną tablicą?

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

    // Other code ... 
} 

Czy jest krótszy lub bardziej idiomatycznych sposób to zrobić w C#?

To będzie wielki, jeśli można to zrobić w pojedynczym sprawozdaniu, podobnie jak w C++:

vector<int> b(a); 

Jeśli nie można tego zrobić w jednym rachunku, wezmę co mam :-)

+2

Nie można po prostu użyć 'Array.Copy'? –

+0

powinien być sposobem na skopiowanie całej pamięci bezpośrednio ... w C++ http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-ofements-from-anar- –

+0

http: // stackoverflow.com/questions/5655553/whats-the-najbardziej-skuteczny-way-to-copy-elements-of-ac-ostro-wielowymiarowych-arr –

Odpowiedz

12

Lubię przy użyciu LINQ do tego:

int[] b = a.ToArray(); 

Mając na uwadze powyższe, Array.Copy ma lepszą wydajność, jeśli zostanie to wykorzystane w ciasnej pętli itp:

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

Edit:

To będzie wielki, jeśli można to zrobić w pojedynczym sprawozdaniu, podobnie jak w C++:

wektor b (a);

C# wersja ta będzie:

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

List<T> jest C# 's odpowiednik std::vector<T>. W constructor above współpracuje z dowolnym IEnumerable<T>, w tym innym List<T>, tablica (T[]) itd

+0

+1 - Nigdy nie brałem pod uwagę LINQ. Ładne rozwiązanie! –

6

Zastosowanie Array.Copy skopiować tablicę

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

Spróbuj także funkcję domyślnego Clone() który jest realizowany z poziomu interfejsu IClonable.

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

Clone() i ToArray() są składniowo miłe, bo nie trzeba wstępnie przydzielić tablicy docelowej, ale pod względem wydajności, Array.Copy() to najszybsza metoda (patrz poniżej zastrzeżenie).

Powód, dla którego Array.Copy() jest tak szybki, nie alokuje żadnej pamięci. Jeśli jednak chcesz, aby twoje tablice były kopiowane do nowego regionu pamięci za każdym razem, to Array.Copy() nie jest już najszybszą metodą.

Oto moje WYNIKI:

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

A oto kod użyłem:

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"); 
Powiązane problemy