2010-11-06 53 views
1

嘿大家。我有一個函數可以與短輸入值一起使用,就像字節輸入值一樣,這裏pixelData是一個填充有字節或短褲的數組。字節和短褲的類型問題

 byte oColor; 
     if (pixelData[counter/3] < minValue) 
      oColor = 0; 
     else if (pixelData[counter/3] > maxValue) 
      oColor = 255; 
     else 
      oColor = (byte)(((pixelData[counter/3] - (WindowLevel - (WindowWidth/2))) * 255)/WindowWidth); 

然後,我有以下代碼:

bool isShort = ReadIsShort(); 
if(isShort){ 
shortArray = ReadShortArray(); 
} else { 
byteArray = ByteArray(); 
} 

爲了獲得短期或字節數組。但是,我不能在上面的函數中使用它們。由於這樣的東西不起作用。

var pixelData; 
if(IsShort) 
pixelData = shortArray; 
else 
pixelData = byteArray; 

任何人都知道我應該如何編程,因爲這顯然是一個設計缺陷。

回答

1

由於C#是一種強類型語言,因此每個變量都必須有一個定義良好的類型。因此,pixelData只能是短的的一個字節數組。到目前爲止,這裏沒有設計缺陷。我假設,你的計算或多或少是性能關鍵的(因爲有像素參與:)),所以我不會重複使用裝箱(轉換爲對象[])或創建列表或類似的建議的東西。

即使使用泛型也不是一種選擇,因爲您不能爲泛型函數提供arithemtic類型約束(請參閱this qestion)我能想到的唯一解決方案是複製代碼並編寫兩個顯式版本,每個數據類型一個。

+0

是的,那也是我一直在想的。我想這會是重複的代碼=( – 2010-11-06 21:21:56

+0

哦,由於設計缺陷,我的意思是我的設計缺陷。 – 2010-11-07 10:29:50

0

你可以改變pixelDataobject[]和使用

if (isShort) 
    Array.Copy(shortData, pixelData, shortData.Length); 
else 
    Array.Copy(byteData, pixelData, byteData.Length); 
1

你可以嘗試獲得object[]陣列,並以此作爲最終else。不過,我不確定我是否爲這個問題開始瘋狂。有什麼方法可以返回並重構,以便有一致的數據類型?

oColor = (byte)(((Convert.ToInt16(pixelData[counter/3]) - (WindowLevel - (WindowWidth/2))) * 255)/WindowWidth); 
+0

哦,是的,絕對有一種我可以重構的方式。但我不太清楚我是如何執行它的。 – 2010-11-06 21:14:55

0

你需要聲明一個類型pixelData - 一個既短或字節將轉換爲或可能包含你的陣列。

您可以將字節數組更改爲短褲列表,因爲這樣不會丟失任何數據?然後你可以改變你的功能只是一種類型 - 像List<Short>

0

你可以嘗試使用Comparer<T>一個通用的方法,但我不知道這將如何影響性能:

void ProcessPixelData<T>(T[] pixelData, T minValue, T maxValue) 
{ 
    // ... 

    byte oColor; 
    if (Comparer<T>.Default.Compare(pixelData[counter/3], minValue) < 0) 
     oColor = 0; 
    else if (Comparer<T>.Default.Compare(pixelData[counter/3], maxValue) > 0) 
     oColor = 255; 
    else 
     oColor = (byte)(((pixelData[counter/3] - (WindowLevel - (WindowWidth/2))) * 255)/WindowWidth); 

    // ... 
} 

其實,不能ByteArray()回報short[]?然後,您可以將pixelData作爲short[]用於這兩種情況。