Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将C中的任何数字类型与零进行比较#_C#_.net_Silverlight - Fatal编程技术网

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

C# 如何将C中的任何数字类型与零进行比较#,c#,.net,silverlight,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; } 我是否

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

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)
首先,我只想让转换器与整数一起工作,但我的想象力开始失控,我想如果我有浮点数和其他数字类型会怎么样。我想使转换器尽可能灵活。起初我以为所有这些额外的信息都会妨碍我想做的事情,所以我没有把它包括在我的问题中。

试试:

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

为什么不直接转换为Convert.ToDouble或Convert.ToDecimal,然后进行比较?这似乎可以处理大多数可能传入的类型。

我的首选是:

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

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

调用者知道类型吗?如果是,那么:

public static bool GreaterThanZero<T>(T value) where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) > 0;
}
公共静态bool大于零(T值),其中T:struct,i可比较
{
返回值.CompareTo(默认值(T))>0;
}
不需要转换,并且应该适用于任何内置数字类型——以及您自己提出的任何合理的值类型。(例如,这对于野田佳彦时间的
Duration
struct很好。)


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

你可以避免使用泛型进行装箱和拆箱:

下面是函数的定义

class GenericComparation {
    public static bool IsGreaterThanZero<T>(T value) where T : IComparable<T> {
        // Console.WriteLine(value.GetType().Name)
        return value.CompareTo(default(T)) > 0;
    }
}
嗯??您关心哪些数字类型

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);

将任何数字类型与零进行比较的最简单、最快速的方法如下:

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


为什么这比只使用>操作符更可取?将其转换为字符串怎么样?将其与“0”进行比较@Nick您无法将int与对象进行比较…@Nick,因为您无法使用>将对象与int进行比较,但为什么他首先要传递一个对象?他有什么不是内置类型的数值对象?在具有泛型的强类型语言中使用“object”通常意味着某种气味。这不是特别有效,因为它是字符串,然后是双精度的…是的,但我认为另一种选择是使用Convert.ToDouble或类似的东西,这(a)可能会引发异常和(B)我也不知道这个有多有效。无论如何,如果.NET有一个Covert.trytodoull返回一个布尔值而不是抛出一个异常,这将是一个理想的选择,但这似乎不是exist@Mike:查看我的答案-它基本上可以处理这种情况,没有字符串转换…@Reed:在你的答案中,调用者不能传入类似“notANumber”的字符串吗,让它通过IConvertable测试,然后抛出InvalidCastException。就效率而言,我主要关心的一个问题是避免基于输入数据的异常,如果输入是无法转换为数值的字符串,这些转换函数不会引发异常吗?如果调用方传入非数值字符串值,这不会引发异常吗?@Mike:可能-如果需要,可以通过try/catch进行处理,虽然。@Mike:OP指定这将是一个数值,但是-如果这是真的,上面的内容就可以了。如果不是,您将需要异常处理……我的观点是,我认为抛出和捕获异常比字符串解析对性能的影响要糟糕得多。一个非数字字符串应该作为函数的公共输入(因为没有任何限制或避免它的方法),那么它就不是一个真正的例外情况,不应该保证函数的性能影响exception@Mike:仅当引发异常时,性能命中才有效。未触发的try/catch几乎没有性能。打如果你的标准,真正的情况是处理这个没有例外,这将是更好的性能。而不是每次都转换成字符串并返回(因为所有好的数据都是如此)。对我来说,这是最好的答案。类型安全(无强制类型转换例外)、高效(无转换或try/catch)并覆盖所有基础。@Russel:除了双精度之外,调用站点上的所有内容都将进行隐式强制类型转换。请使用.Net Reflector查看它。它对十进制也不起隐式作用。+1 Hightechrider和+1 Russell:我完全同意你们两个的观点。IsValueType不保证值是数值。可以是结构,也可以是普通的“对象”,或者是任意字符串。
public bool IsGreaterThanZero(object value) 
{ 
    if (value != null && value.GetType().IsValueType)
        return System.Convert.ToDouble(value) > 0;
    return false; 
}