C# 对于不同维数的数组,是否存在有效的Array.Copy等价物?
我有两个阵列:C# 对于不同维数的数组,是否存在有效的Array.Copy等价物?,c#,.net,C#,.net,我有两个阵列: T[] array1D; T[,] array2D; 它们各自具有相同的元素总数 如果这些数组的维数相同,那么我可以简单地使用Array.Copy将数据从一个数组复制到另一个数组。但由于它们的尺寸数量不同,根据MSDN文档,我不能: sourceArray和destinationArray参数的维数必须相同 在分析了我的代码之后,我确定单独复制每个元素对于我来说太慢了。那么,是否有一种替代Array.Copy的方法可以在不同维度的数组之间进行复制,其性能类似于Array.Cop
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;
}
}
int-iMax=array2D.GetLength(0);
int jMax=array2D.GetLength(1);
int指数=0;
对于(int i=0;i
这应该比您的代码运行得快,但不确定要快多少。让我们知道:
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();
}
publicstatict[]数组(T[,]数组)
{
列表值=新列表(array.Length);
foreach(数组中的变量项)
{
增加(项目);
}
返回值。ToArray();
}
编辑:
这应该更快。任何更快的解决方案都可能需要一些非托管解决方案
public static T[] FlattenArray<T>(T[,] array)
{
T[] values = new T[array.Length];
Buffer.BlockCopy(array, 0, values, 0, values.Length);
return values;
}
publicstatict[]数组(T[,]数组)
{
T[]值=新的T[array.Length];
块复制(数组,0,值,0,值,长度);
返回值;
}
这可能会中断,因为您不确定是否可以像这样并行单个对象(数组)我尝试使用少量元素和字符串 我喜欢区块复制的答案
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;
}
private String[]ArrayCopy(String[,]array2D)
{
int iMax=array2D.GetLength(0);
int jMax=array2D.GetLength(1);
String[]array1D=新字符串[iMax*jMax];
对于(int i=0;i
{
//System.Diagnostics.Debug.WriteLine(“j循环并行”+j.ToString()+“”+array2D[i,j]);
阵列1d[(i*jMax)+j]=阵列2d[i,j];
});
}
返回数组1d;
}
张贴用于复制的代码。也可以考虑包装一个数组,你只需翻译维度的数量。@ BLAM发布,谢谢。你试过平移二维数组吗?示例代码。代码有多黑客?你可以使用指针,不安全的和原始的memcpy…为什么不直接创建一个数组?@hvd,因为这样你就不能用foreach来创建数组,否则对它毫无意义,因为你必须增加索引,这将导致代码与OPs解决方案几乎相同。你只需要一个索引,而不是OP代码中的三个索引,因此,这仍然可能是一个进步。(foreach(数组中的var项)值[index++]=item;
)无论如何,首先创建一个列表,填充它,然后从该列表创建一个数组的开销可能会很高,这可能是一个比直接创建数组更糟糕的解决方案。但是您的编辑(也在问题的评论中提到)避免了这个问题。它不应该是Buffer.BlockCopy(array,0,values,0,values.Length*sizeof(t))代码>?谢谢!!Buffer.BlockCopy在我的情况下起作用,因为T恰好是非托管类型。如果T是引用类型,我仍然希望看到一个有效的答案。