c#多维数组转换

时间:2016-04-13 15:52:29

标签: c# arrays multidimensional-array

我想将int[,]的多维数组转换为ushort[,]的数组,如果可能的话,不要在每个维度上循环。

我找到post object[,],其中double[,]使用Array.Copy转换为double。不幸的是,这只能起作用,因为对象已经是var input = new [,] { {1,1,1}, {2,2,2}, {3,3,3} }; var output = new ushort[3, 3]; // Convert Array.Copy(input, output, input.Length); 类型。有没有机会实现类似的结果将int转换为ushort(假设它总是适合)?

int

上面的代码编译,但执行失败,因为它无法从ushort转换为for(var i=0; i<input.GetLength(0); i++) for(var j=0; j<input.GetLength(1); j++) output[i,j] = (ushort)input[i,j]; 。我知道为什么会发生这种情况,我只想告诉.NET它应该只是转换。 正如我所说,我知道最简单的解决方案是两个循环。如果有替代方案,我很好奇。

结论:不幸的是,没有快速和内置的方法来做到这一点。因此,除非你真的需要闪电般的速度快速转换,否则我建议使用明显且可读的双循环解决方案。

Series

然而,这不是公认的解决方案,因为我个人感兴趣的是我要求最快的替代方案,就像预期的那样,以及邪恶和不安全的指针转换。

2 个答案:

答案 0 :(得分:3)

这将没有任何转换开销。而且,它是邪恶的,但我会这样做。

    static unsafe void FastCopy(int[,] source, ushort[,] destination)
    {
        //pin the source and destination arrays
        fixed (int* pSource = source) fixed (ushort* pDestination = destination)
        {
            //compute the pointers for the elements just past the arrays
            //as termination conditions
            var pSourceEnd = pSource + source.Length;
            var pDestinationEnd = pDestination + destination.Length;

            //setup our iterator variables
            var pSourceCurrent = pSource;
            var pDestinationCurrent = pDestination;

            //loop over each element until you run out of elements in 
            //either the source or destination
            while (pSourceCurrent < pSourceEnd && pDestinationCurrent < pDestinationEnd)
            {
                //copy the two lowest bytes in each source int to the
                //destination ushort
                *pDestinationCurrent++ = *(ushort*)pSourceCurrent++;
            }
        }
    }

答案 1 :(得分:1)

好吧,由于数组是低级结构,因此无法就地转换,因此int[,]ushort[,]的内存占用量会有所不同。此外,没有内置的方法来转换2-D数组,因此最简单的选择是循环并用转换后的值填充新数组。