我想创建一个函数来检查作为参数传递的数值是否具有大于零的值。像这样:
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一起工作,但我的想象力开始疯狂,想想如果我有浮点数和其他数字类型。我想让转换器尽可能灵活。最初我认为所有这些额外信息都会妨碍我想做的事情,所以我没有把它包含在我的问题中。
答案 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;
}