我想将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
然而,这不是公认的解决方案,因为我个人感兴趣的是我要求最快的替代方案,就像预期的那样,以及邪恶和不安全的指针转换。
答案 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数组,因此最简单的选择是循环并用转换后的值填充新数组。