0

我正在从 Arduino(c 语言)切换到 Netduino(c# 语言)。

在我的 arduino 程序中,我有以下功能(内置):

约束

我想将其转换为 C#。我有以下代码:

int ConstrainValue(int value, int min, int max)
    {
        int Value = value;
        int Min = min;
        int Max = max;

        if (Value >= Max)
        {
            Value = Max;
            return Value;
        }
        else if (Value <= Max)
        {
            Value = Min;
            return Value;
        }
        return Value;
    }

但是,我也希望能够将其用于double数据类型。是否可以修改函数以便可以使用多种数据类型?

4

5 回答 5

5

它是,使用IComparable.

static T ConstrainValue<T>(T value, T min, T max) where T : IComparable
{
    if (value.CompareTo(max) > 0)
        return max;
    else if (value.CompareTo(min) < 0)
        return min;
    return value;
}
于 2013-01-28T10:12:39.123 回答
1

是的,您需要将其设为通用函数,如下所示:

T ConstrainValue<T>(T value, T min, T max) where T : IComparable

我认为您需要添加更多接口

于 2013-01-28T10:11:43.787 回答
1

通过指定struct,调用方法时不会装箱,但使用时调用时仍会得到装箱,IComparable因为CompareTo该接口方法需要一个object.

所以使用IComparable<T>,我很确定现在没有拳击:

    private static T ConstrainValue<T>(T value, T min, T max)
      where T : struct, IComparable<T>
    {
        if (value.CompareTo(max) > 0)
        {
            return max;
        }

        if (value.CompareTo(min) < 0)
        {
            return min;
        }

        return value;
    }
于 2013-01-28T10:17:00.783 回答
0

.net micro (netduino)从 v4.2 开始不支持泛型

您将不得不使用另一种方案,例如将对象作为参数然后执行工作的函数。然后,您必须在调用函数的返回值上使用“as”或强制转换:

    object ConstrainValueInt(object value, object min, object max)
        {
   /* this could still get you in trouble with bool type */
          if (value.GetType().isValueType && min.GetType().isValueType && max.GetType().isValueType )
          return ( (value >= max)? max : ((value <= min)? min : value));
        }
于 2013-01-31T16:09:42.147 回答
0

通过使用泛型,您可以使用多种数据类型

T ConstrainValue(T value, T min, T max) 其中 T : IComparable

于 2013-01-28T10:18:27.443 回答