使用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
如果我替换by ,结果会略有不同object
。
Indexer method: 0.05 s
Set/GetValue method: 0.54 s
这可以通过使用整数时的必要装箱/拆箱来轻松解释Set/GetValue
。