如何在C#中将任何数字类型与零进行比较

时间:2010-03-10 19:28:18

标签: c# .net silverlight

我想创建一个函数来检查作为参数传递的数值是否具有大于零的值。像这样:

public bool IsGreaterThanZero(object value)
{
    if(value is int)
    {
        return ((int)value > 0);
    }
    else if(value is float)
    {
        // Similar code for float
    }

    return false;
}

我可以尝试将作为函数参数传递的对象转换为一个数值数据类型,这样我就可以将它与零进行比较,而不是检查if语句中的每个类型吗?如果演员表失败,我会返回false。是否有更好的(读取更短,更易读)的方法来做到这一点?

修改 有些人问我是否知道这个类型是数字,为什么是对象等等。我希望这会让事情变得更清楚。

此函数将是Silverlight转换器的一部分,该转换器实现IValueConverter接口,其转换签名为

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

首先,我只想让转换器与int一起工作,但我的想象力开始疯狂,想想如果我有浮点数和其他数字类型。我想让转换器尽可能灵活。最初我认为所有这些额外信息都会妨碍我想做的事情,所以我没有把它包含在我的问题中。

7 个答案:

答案 0 :(得分:16)

我的偏好是:

public bool IsGreaterThanZero(object value)
{
    if(value is IConvertible)
    {
        return Convert.ToDouble(value) > 0.0;
    }

    return false;
}

这将安全地处理所有IConvertible类型(包括框架中的所有浮点和整数类型,但也包括任何自定义类型)。

答案 1 :(得分:14)

来电者是否知道该类型?如果是这样,那怎么样:

public static bool GreaterThanZero<T>(T value) where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) > 0;
}

不需要转换,并且应该适用于任何内置数字类型 - 以及您自己提出的任何合理的值类型。 (例如,Noda Time的Duration结构就可以了。)

请注意,调用者不必直接知道类型 - 它可能只知道具有相同约束的另一个类型参数。诚然,这可能不适合你的情况,但我想我还是会提到它。如果在编译时没有什么知道类型(并且你不想在C#4中为你做工作的动态类型!)那么调用Convert.ToDouble可能是你最好的选择 - 只要知道它可能有来自.NET 4.0的System.Numerics.BigInteger的问题。

答案 2 :(得分:4)

嗯?你关心什么数字类型?

public bool IsGreaterThanZero(double value)
{
    return value > 0;
}

这些都有效......

    IsGreaterThanZero((int)2);
    IsGreaterThanZero((long)2);
    IsGreaterThanZero((double)2);
    IsGreaterThanZero((float)2);
    IsGreaterThanZero((byte)2);
    IsGreaterThanZero((ulong)2);

答案 3 :(得分:3)

您可以使用泛型来避免装箱和拆箱:

这是函数的定义

class GenericComparation {
    public static bool IsGreaterThanZero<T>(T value) where T : IComparable<T> {
        // Console.WriteLine(value.GetType().Name)
        return value.CompareTo(default(T)) > 0;
    }
}

用法:

Console.WriteLine(GenericComparation.IsGreaterThanZero(1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(-1.1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(Decimal.Zero));

答案 4 :(得分:2)

尝试:

double tempValue;
if(double.TryParse(value.ToString(), out tempValue)
{
  return (tempValue > 0)
}
else 
{
  return false;
}

答案 5 :(得分:1)

为什么不只是Convert.ToDouble或Convert.ToDecimal然后进行比较?似乎可以处理有人可能传入的大多数类型。

答案 6 :(得分:1)

这种最简单,最快速的方法来比较任何数字类型为零如下:

public bool IsGreaterThanZero(object value) 
{ 
    if (value != null && value.GetType().IsValueType)
        return System.Convert.ToDouble(value) > 0;
    return false; 
}