我需要在C#
中将short []转换为ushort []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
由于
答案 0 :(得分:3)
我看到了几个选项:
img.PixelData.Cast<ushort>().ToArray();
或者也许:
img.PixelData.Select(Convert.ToUInt16).ToArray();
两者都利用LINQ的能力将变换函数应用于集合。
答案 1 :(得分:1)
作为正常的解决方案,我建议:
unsigned = ConvertAll(signed, i => (ushort)i)
这比LINQ解决方案产生的垃圾少,同样简洁易读。
一个好的老式循环也是一个考虑因素,因为它允许您转换为现有数组,而不是分配一个新数组。
作为价值转换功能,您可以使用:
C样式转换i => (ushort)i
默认情况下不会抱怨整数溢出(您可以在编译器设置中更改它)
要明确说明,您可以根据自己想要的行为来撰写i => unchecked((ushort)i)
或i => checked((ushort)i)
。
Convert.ToInt16
如果输入大于OverflowException
则抛出short.MaxValue
,无论编译器设置如何。有一个有趣/邪恶的技巧,可让您将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
是必要的。