输入字节和短路的问题

时间:2010-11-06 20:59:19

标签: c# types

嘿大家好我有一个兼容短输入值的函数,就像字节输入值一样,这里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;

任何人都知道我应该如何编程,因为这显然是一个设计缺陷。

5 个答案:

答案 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[]处理这两种情况。