对于具有不同维数的数组,是否存在有效的Array.Copy等价物?

时间:2014-03-30 16:23:19

标签: c# .net

我有两个数组:

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;
            }
        }

2 个答案:

答案 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;
}