[英]convert short[] to 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
謝謝
我看到幾個選擇:
img.PixelData.Cast<ushort>().ToArray();
也許:
img.PixelData.Select(Convert.ToUInt16).ToArray();
兩者都利用LINQ將轉換功能應用於集合的能力。
作為常規解決方案,我建議:
unsigned = ConvertAll(signed, i => (ushort)i)
與LINQ解決方案相比,這產生的垃圾更少,並且同樣簡潔明了。
一個好的老式循環也是一個考慮因素,因為它允許您轉換為現有數組,而不是分配新數組。
作為值轉換功能,您可以使用:
C樣式強制轉換i => (ushort)i
,默認情況下它不會抱怨整數溢出(您可以在編譯器設置中進行更改)
確切地說,您可以根據所需的行為編寫i => unchecked((ushort)i)
或i => checked((ushort)i)
。
short.MaxValue
,則Convert.ToInt16
會引發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
中間轉換的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.