Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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#_Comparison - Fatal编程技术网

C# 一般比较两个对象

C# 一般比较两个对象,c#,comparison,C#,Comparison,我知道这是一个幼稚的问题,经过两年的经验,我坚持要回答这个问题 简单地说,我需要创建一个通用方法,该方法可以使用int、double、float并比较它们,然后找到更大的值: object ComapreMethod(object obj1, object obj2) { if(obj1 > obj2) { return obj1; } return obj2; } 我想把它叫做int、short、ushort、float、double

我知道这是一个幼稚的问题,经过两年的经验,我坚持要回答这个问题

简单地说,我需要创建一个通用方法,该方法可以使用int、double、float并比较它们,然后找到更大的值:

object ComapreMethod(object obj1, object obj2)
{ 
    if(obj1 > obj2)
    {
        return obj1;
    }

    return obj2;
}
我想把它叫做int、short、ushort、float、double等等,我真正想知道的是如何比较obj1和obj2,我不能用上面的方法来写
我知道这很幼稚,但我不知道。好吧,您可以使用泛型更改方法签名:

TType ComapreMethod<TType>(TType obj1, TType obj2) where TType : IComparable
t类型ComapreMethod(t类型obj1,t类型obj2),其中t类型:i可比较
并将方法中的代码从
if(obj1>obj2)
更改为
if(obj1.CompareTo(obj2)>0)
(不要忘记处理obj1和obj2为null的情况)


在这种情况下,您将能够向您的方法传递实现了
IComparable
接口的某些类的值,包括int、double和float。

有一个内置的解决方案,可以满足您的需要,
Math.Max
():

这将适用于可以隐式转换为相同类型的任何不同类型input1和input2。因此,您可以交替使用
int
float
double
,它将以适当的类型返回适当的值(例如,如果传递int和double,它将返回double)

如果您想修改方法以接受double,您也可以:

double CompareMethod(double obj1, double obj2) 
{
    if (obj1.CompareTo(obj2) > 0)
    {
        return obj1;
    }
    return obj2;
}
这再次使用隐式类型转换将int转换为double等。这意味着您的返回类型始终是double,但如果您希望int返回和int,则可以创建重载,编译器应该选择最佳的重载


就我个人而言,虽然我建议您只使用内置的

,但您可以使用反射来完成。我得到第一个的类型,得到
CompareTo
方法并运行它:

void Main()
{
    float a = 2;
    float b = 1;
    ComapreMethod(a, b); // A > B

    short c = 0;
    short d = 3;
    ComapreMethod(c, d); // A < B

    int e = 1;
    int f = 1;
    ComapreMethod(e, f); // A == B
}

// you can change the return type as you wish
string ComapreMethod(object a, object b)
{ 
    var result = Convert.ToInt32(a.GetType().GetMethods().First(o => o.Name == "CompareTo").Invoke(a, new object[] { b }));

    if (result == 0)
        return "A == B";
    else if (result > 0)
        return "A > B";
    else if (result < 0)
        return "A < B";
    else
        return "I don't know...";
}
void Main()
{
浮点数a=2;
浮动b=1;
ComapreMethod(a,b);//a>b
短c=0;
短d=3;
ComapreMethod(c,d);//Ao.Name==“CompareTo”).Invoke(a,新对象[]{b});
如果(结果==0)
返回“A==B”;
否则,如果(结果>0)
返回“A>B”;
否则如果(结果<0)
返回“A
我想您需要比较两种不同的类型。例如int和decimal

    static void Main(string[] args)
    {
        decimal p = 15.5m;
        int q = 5;

        Console.WriteLine(CompareTo<int, decimal, decimal>(q, p));

    }

    public static T3 CompareTo<T1, T2, T3>(T1 value1, T2 value2) 
        where T3:IComparable
    {
        T3 p = ConvertTo<T3>(value1);
        T3 q = ConvertTo<T3>(value2);

        if(p.CompareTo(q) >= 0)
        {
            return p;
        }
        else
        {
            return q;
        }
    }

    public static T ConvertTo<T>(object value)
    {
        try
        {
            return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
        }
        catch(Exception ex)
        {
            return (T)(typeof(T).IsValueType ? Activator.CreateInstance(typeof(T)) : null);
        }

    }
static void Main(字符串[]args)
{
小数p=15.5m;
int q=5;
控制台写入线(与(q,p)相比);
}
公共静态T3比较(T1值1、T2值2)
其中T3:i可比较
{
T3 p=转换为(值1);
T3 q=转换器(值2);
如果(p.CompareTo(q)>=0)
{
返回p;
}
其他的
{
返回q;
}
}
公共静态T转换器(对象值)
{
尝试
{
return(T)Convert.ChangeType(value,typeof(T),CultureInfo.InvariantCulture);
}
捕获(例外情况除外)
{
return(T)(typeof(T).IsValueType?Activator.CreateInstance(typeof(T)):null);
}
}

T1
是您的第一个值类型,
T2
是您要比较的第二个值类型,
T3
将是您期望的结果类型(十进制、双精度等)。

最好选择
泛型
。我不明白您的意思。如果数据类型不同,可能会重复您想要做什么?eg只是将它们全部转换为两倍,然后比较是否可以接受?编写比较函数时,通常的方法是返回一个值,该值指示哪个更大或更小,而不是立即返回最大值。有关我的意思的示例,请参见。使用Expression.GreaterThan:))如何使用此方法比较int和decimal?我编写了如何比较两种不同的ernt类型。隐式转换意味着,如果使用decimal和int调用此函数,则只需将int转换为decimal,因此即使给定的类型混淆,也可以使用此函数(我必须承认,这是我根据需要阅读的方式,但可能是错误的)。是的,是的,我写了关于我的例子,这是愚蠢的…:)也许我应该更准确。我会同意,在这种情况下,Math.Max是最好的。可能OPs情况更为复杂,所涉及的流程更为复杂,尽管其他答案对这些情况有帮助。:)是的,他能。但是使用泛型不仅更简单,而且更快。可能数学。Max是最好的答案。我完全忘了!
    static void Main(string[] args)
    {
        decimal p = 15.5m;
        int q = 5;

        Console.WriteLine(CompareTo<int, decimal, decimal>(q, p));

    }

    public static T3 CompareTo<T1, T2, T3>(T1 value1, T2 value2) 
        where T3:IComparable
    {
        T3 p = ConvertTo<T3>(value1);
        T3 q = ConvertTo<T3>(value2);

        if(p.CompareTo(q) >= 0)
        {
            return p;
        }
        else
        {
            return q;
        }
    }

    public static T ConvertTo<T>(object value)
    {
        try
        {
            return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
        }
        catch(Exception ex)
        {
            return (T)(typeof(T).IsValueType ? Activator.CreateInstance(typeof(T)) : null);
        }

    }