我需要将short[]转换为ushort[] in C#
public ushort[] Pixels16bits;
GrayscalePixelDataS16 Pixeldata = PixelDataFactory.Create(img.PixelData, 0) as GrayscalePixelDataS16; //Pixeldata has short[] values
Pixels16bits = pixeldata; //Here's where I struggle, I need to convert to ushort prior to assign to pixels16bits谢谢
发布于 2014-06-20 17:06:03
我看到了几个选择:
img.PixelData.Cast<ushort>().ToArray();或者也许:
img.PixelData.Select(Convert.ToUInt16).ToArray();两者都利用LINQ将转换函数应用于集合的能力。
发布于 2014-06-20 17:15:27
作为通常的解决办法,我建议:
unsigned = ConvertAll(signed, i => (ushort)i)这产生的垃圾比LINQ解决方案少,同时也同样简洁和可读性好。
一个好的老式循环也是一个考虑因素,因为它允许您转换成现有的数组,而不是分配一个新的数组。
作为值转换函数,可以使用:
i => (ushort)i不会抱怨整数溢出(您可以在编译器设置中更改)
实际上,您可以编写i => unchecked((ushort)i)或i => checked((ushort)i),具体取决于您想要的行为。Convert.ToInt16,如果输入大于short.MaxValue,则抛出一个OverflowException,而不管编译器设置如何。有一个有趣的/邪恶的技巧可以让您将short[]作为一个ushort[]来处理,而无需实际转换:
short[] signed = new short[]{-1};
signed.GetType().Dump();// short[]
ushort[] unsigned = (ushort[])(object)signed;
unsigned.GetType().Dump();// still short[]
unsigned[0].Dump(); // 65535它编译并没有抛出运行时错误。
CLR规范说ushort[]和short[]是兼容的,因为将short转换为ushort保留了表示形式。这是与数组协方差类似的机制。
另一方面,C#规范不允许这种转换。这就是为什么中间转换到object是必要的。
https://stackoverflow.com/questions/24332286
复制相似问题