我有两个数组:
T[] array1D;
T[,] array2D;
它们各自具有相同的元素总数。
如果这些数组具有相同的维数,那么我可以简单地使用Array.Copy将数据从一个复制到另一个。但是由于它们具有不同的维度,我不能,根据MSDN文档:
sourceArray和destinationArray参数必须具有相同的维数。
对我的代码进行了分析后,我确定单独复制每个元素对于我的目的来说太慢了。那么,是否可以替代Array.Copy,它可以在具有类似于Array.Copy的性能的不同维度的数组之间进行复制?
谢谢!
(编辑)根据要求,这是我单独复制每个元素的代码:
int iMax = array2D.GetLength(0);
int jMax = array2D.GetLength(1);
int index = 0;
for(int i = 0; i < iMax; ++i)
{
for(int j = 0; j < jMax; ++j)
{
array1D[index] = array2D[i, j];
++index;
}
}
答案 0 :(得分:3)
这应该比你的代码运行得更快,不知道速度有多快。让我们知道:
public static T[] FlattenArray<T>(T[,] array)
{
List<T> values = new List<T>(array.Length);
foreach (var item in array)
{
values.Add(item);
}
return values.ToArray();
}
编辑:
这应该更快。任何更快的事情都可能需要一些不受管理的解决方案。
public static T[] FlattenArray<T>(T[,] array)
{
T[] values = new T[array.Length];
Buffer.BlockCopy(array, 0, values, 0, values.Length);
return values;
}
答案 1 :(得分:0)
这可能会破坏,因为不能确定你可以像这样平行单个对象(数组) 我尝试使用少量元素和字符串
我喜欢BlockCopy答案
private String[] ArrayCopy(String[,] array2D)
{
int iMax = array2D.GetLength(0);
int jMax = array2D.GetLength(1);
String[] array1D = new String[iMax * jMax];
for (int i = 0; i < iMax; ++i)
{
//System.Diagnostics.Debug.WriteLine(" parallel " + i.ToString());
Parallel.For(0, jMax, j =>
{
//System.Diagnostics.Debug.WriteLine(" j loop parallel " + j.ToString() + " " + array2D[i,j]);
array1D[(i * jMax) + j] = array2D[i, j];
});
}
return array1D;
}