2010-11-06 57 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[]用于这两种情况。