使用Array.CreateInstance(Type, Int32[]) 方法创建任意大小的数组。
但是,创建这个数组后,你会遇到的问题是:如果不知道数组的等级,如何有效地访问数组的元素?
您可以使用myArray.GetValue(Int32[]) 和myArray.SetValue(Object, Int32[]),但我认为性能没有那么好。
总结一下:
public static Array CreateArray(Array array)
{
// Gets the lengths and lower bounds of the input array
int[] lowerBounds = new int[array.Rank];
int[] lengths = new int[array.Rank];
for (int numDimension = 0; numDimension < array.Rank; numDimension++)
{
lowerBounds[numDimension] = array.GetLowerBound(numDimension);
lengths[numDimension] = array.GetLength(numDimension);
}
Type elementType = array.GetType().GetElementType(); // Gets the type of the elements in the input array
return Array.CreateInstance(elementType, lengths, lowerBounds); // Returns the new array
}
更新
我做了一个小基准来比较数组索引器和 GetValue、SetValue 版本的性能。
这是我使用的代码:
const int size = 10000000;
object[] array1 = new object[size];
object[] array2 = new object[size];
Random random;
random = new Random(0);
for (int i = 0; i < size; i++)
{
array1[i] = random.Next();
array2[i] = random.Next();
}
Stopwatch stopwatch = new Stopwatch();
Console.ReadKey();
stopwatch.Restart();
for (int i = 0; i < size; i++)
array1[i] = array2[i];
stopwatch.Stop();
Console.WriteLine("Indexer method: {0}", stopwatch.Elapsed);
random = new Random(0);
for (int i = 0; i < size; i++)
{
array1[i] = random.Next();
array2[i] = random.Next();
}
Console.ReadKey();
stopwatch.Restart();
for (int i = 0; i < size; i++)
array1.SetValue(array2.GetValue(i), i);
stopwatch.Stop();
Console.WriteLine("Get/SetValue method: {0}", stopwatch.Elapsed);
结果是:
Indexer method: 0.014 s
Set/GetValue method: 1.33 s
如果我将int 替换为object,结果会略有不同。
Indexer method: 0.05 s
Set/GetValue method: 0.54 s
这可以通过Set/GetValue 使用整数时的必要装箱/拆箱来轻松解释。