【问题标题】:convert short[] to ushort[]将 short[] 转换为 ushort[]
【发布时间】:2014-06-20 17:03:16
【问题描述】:

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

谢谢

【问题讨论】:

  • 有趣的技巧:short[] signed = new short[1]; ushort[] unsigned = (ushort[])(object)signed; 有效但实际上并没有转换(即unsigned.GetType() 返回short[])。这不会在运行时产生异常。中间 object 步骤是必需的,因为 C# 规范不允许这种转换,但 CLR 规范允许。
  • @CodesInChaos 但它不起作用。它编译。这并不能成为解决方案。数组协方差特定于引用类型。
  • @Servy 它编译并且不会抛出运行时错误。 shortushort 是表示保留,因此运行时允许它。它的工作原理是您得到一个几乎在所有情况下都可以被视为结果类型的对象,尽管运行时类型仍然是原始类型。这不是数组协方差,而是一种非常相似的机制。
  • 这个问题是关于将数组short[]转换为ushort[],假设的重复是关于将整数值short转换为ushort
  • 感谢@CodesInChaos,它工作得很好

标签: c# casting short ushort


【解决方案1】:

我看到了几个选项:

img.PixelData.Cast<ushort>().ToArray();

或许:

img.PixelData.Select(Convert.ToUInt16).ToArray();

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

【讨论】:

  • 您的第二个变体可以通过使用方法组转换而不是 lambda 来简化:.Select(Convert.ToUInt16)
  • 太棒了!这成功了:Pixels16bits=Pixeldata.Data.Select(Convert.ToUInt16).ToArray();
【解决方案2】:

作为我推荐的常规解决方案:

unsigned = ConvertAll(signed, i => (ushort)i)

这比 LINQ 解决方案产生的垃圾更少,同时同样简洁易读。

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

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

  • C 风格转换 i =&gt; (ushort)i 默认情况下不会抱怨整数溢出(您可以在编译器设置中更改)

    更明确地说,你可以写i =&gt; unchecked((ushort)i)i =&gt; 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 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多