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;
任何人都知道我应该如何编程,因为这显然是一个设计缺陷。
答案 0 :(得分:1)
您可以尝试获取object[]
数组并将其用作最终else
。不过,我不确定我是否会对这个问题感到疯狂。有什么方法可以返回并重构,以便有一致的数据类型吗?
oColor = (byte)(((Convert.ToInt16(pixelData[counter / 3]) - (WindowLevel - (WindowWidth / 2))) * 255) / WindowWidth);
答案 1 :(得分:1)
由于C#是强类型语言,因此每个变量都必须具有明确定义的类型。因此,pixelData
只能是短或字节数组。到目前为止,imo没有设计缺陷。
我认为,你的计算或多或少对性能至关重要(因为涉及像素:)),所以我不会重复使用装箱(强制转换为对象[])或创建列表或类似东西的建议
即使使用泛型也不是一种选择,因为你不能为泛型函数赋予arithemtic类型约束(参见this qestion)我能想到的唯一解决方案是复制代码并编写两个显式版本,每个版本一个数据类型。
答案 2 :(得分:0)
您可以将pixelData
更改为object[]
并使用
if (isShort)
Array.Copy(shortData, pixelData, shortData.Length);
else
Array.Copy(byteData, pixelData, byteData.Length);
答案 3 :(得分:0)
你需要为pixelData
声明一个类型 - 一个short或byte都可以转换为,或者可以包含你的数组。
你可以将字节数组更改为Short的List,因为这不会丢失任何数据吗?然后,您可以将您的功能更改为仅对一种类型执行操作 - 类似于List<Short>
。
答案 4 :(得分: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[]
处理这两种情况。