首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将short[]转换为ushort[]

将short[]转换为ushort[]
EN

Stack Overflow用户
提问于 2014-06-20 17:03:16
回答 2查看 2.9K关注 0票数 0

我需要将short[]转换为ushort[] in C#

代码语言:javascript
复制
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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-20 17:06:03

我看到了几个选择:

代码语言:javascript
复制
img.PixelData.Cast<ushort>().ToArray();

或者也许:

代码语言:javascript
复制
img.PixelData.Select(Convert.ToUInt16).ToArray();

两者都利用LINQ将转换函数应用于集合的能力。

票数 3
EN

Stack Overflow用户

发布于 2014-06-20 17:15:27

作为通常的解决办法,我建议:

代码语言:javascript
复制
unsigned = ConvertAll(signed, i => (ushort)i)

这产生的垃圾比LINQ解决方案少,同时也同样简洁和可读性好。

一个好的老式循环也是一个考虑因素,因为它允许您转换成现有的数组,而不是分配一个新的数组。

作为值转换函数,可以使用:

  • 默认情况下,C样式的强制转换i => (ushort)i不会抱怨整数溢出(您可以在编译器设置中更改) 实际上,您可以编写i => unchecked((ushort)i)i => checked((ushort)i),具体取决于您想要的行为。
  • Convert.ToInt16,如果输入大于short.MaxValue,则抛出一个OverflowException,而不管编译器设置如何。

有一个有趣的/邪恶的技巧可以让您将short[]作为一个ushort[]来处理,而无需实际转换:

代码语言:javascript
复制
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是必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24332286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档