将short []转换为ushort []

时间:2014-06-20 17:03:16

标签: c# casting short ushort

我需要在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

由于

2 个答案:

答案 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是必要的。