如何使用另一个数组创建和初始化数组?

时间:2012-03-29 00:02:10

标签: c# arrays

要使用另一个数组创建和初始化数组,我目前正在执行此操作:

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 ++中,那就太棒了:

vector<int> b( a );

如果不能在一个声明中做到这一点,我将采取我得到的结果: - )

6 个答案:

答案 0 :(得分:15)

我喜欢使用LINQ:

int[] b = a.ToArray();

话虽如此,Array.Copy确实有更好的性能,如果这将在紧密循环中使用,等等:

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

编辑:

  

如果可以在单个语句中完成,例如在C ++中,那就太棒了:

     

向量b(a);

C#的版本是:

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

List<T>是C#相当于std::vector<T>constructor above适用于任何IEnumerable<T>,包括其他List<T>,数组(T[])等。

答案 1 :(得分:6)

使用Array.Copy复制数组

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

答案 2 :(得分:2)

Clone()和ToArray()在语法上很好,因为您不需要预先分配目标数组,但就性能而言,Array.Copy()是最快的方法(请参阅下面的警告)。

Array.Copy()如此之快的原因是它没有分配任何内存。但是,如果每次都需要将数组复制到新的内存区域,则Array.Copy()不再是最快的方法。

以下是我的表现结果:

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

以下是我使用的代码:

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

答案 3 :(得分:1)

同时尝试从Clone()界面实现的默认IClonable函数。

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

答案 4 :(得分:0)

您可以通过创建新的空数组轻松地实现此目的,也可以使用给定的数组。

int[] arr = { 1, 2, 0, 3, 4, 5, 0, 6, 0, 7, 8, 9, 0 };
int[] newArray = new int[arr.Length];

Array.Copy(arr, newArray, arr.Length);

foreach (var item in newArray)
{
   if(item != 0)
   Console.WriteLine(item);
}   

答案 5 :(得分:0)

这个解决方案绝不是最快的,也不是最优雅的,但是如果您需要跳过原始数组中的某些元素,或者可能转换它们,您可以使用 Linq 来完成此操作

var sourceArray = new int[] {1,2,3,4,5,6,7,8,9 };
var targetArray = sourceArray.Select(s => s).ToArray();

// targetArray now contains 1,2,3,4,5,6,7,8,9

承认,这看起来有点傻,除非你需要在复制过程中执行某种操作

var sourceArray = new int[] {1,2,3,4,5,6,7,8,9 };
var targetArray = sourceArray.Skip(1).Take(3).Select(s => s*s+4).ToArray();

// targetArray now contains 8,13,20