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是引用类型,我仍然希望看到一个有效的答案。