0

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

ありがとう

4

2 に答える 2

3

いくつかのオプションがあります。

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

多分:

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

どちらも、変換関数をコレクションに適用する LINQ の機能を利用しています。

于 2014-06-20T17:06:03.610 に答える
1

通常の解決策として、次をお勧めします。

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

これにより、LINQ ソリューションよりもガベージが少なくなり、同様に簡潔で読みやすくなります。

新しい配列を割り当てる代わりに、既存の配列に変換できるため、古き良きループも考慮に入れます。

値変換関数として、次のいずれかを使用できます。

  • i => (ushort)iデフォルトで整数オーバーフローについて文句を言わないC スタイルのキャスト(コンパイラ設定で変更できます)

    i => unchecked((ushort)i)本当に明示的にするには、または必要i => checked((ushort)i)な動作に応じて書くことができます。

  • Convert.ToInt16これは、コンパイラの設定に関係なくOverflowException、入力がそれよりも大きい場合にスローします。short.MaxValue

実際に変換せずにshort[]a を a として扱うことができる楽しい/邪悪なトリックがあります。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が必要です。

于 2014-06-20T17:15:27.117 に答える