通常比较两个对象

时间:2014-12-29 12:40:06

标签: c# comparison

我知道一个天真的问题,经过两年的经验,我很难回答它。

我只需要创建一个泛型方法,这个方法可以采用int,double,float和比较它们并找到更大的值:

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

    return obj2;
}

我想把它称为int,short,ushort,float,double,...等我真正坚持如何比较obj1和obj2我不能通过上面的方式写它 我知道这很天真,但我不知道

4 个答案:

答案 0 :(得分:8)

好吧,您可以使用泛型更改方法签名:

TType ComapreMethod<TType>(TType obj1, TType obj2) where TType : IComparable

并将方法中的代码从if(obj1>obj2)更改为if (obj1.CompareTo(obj2) > 0)(并且不要忘记处理obj1和obj2为空的情况)。

在这种情况下,您将能够传递给某个实现IComparable接口的类的方法值,包括整数,双精度和浮点数。

答案 1 :(得分:4)

有一个内置的解决方案可以做你想做的事情,Math.MaxMSDN docs):

var myMax = Math.Max(input1, input2);

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

如果您想要修改您的方法以接受双打,也可以:

double CompareMethod(double obj1, double obj2) 
{
    if (obj1.CompareTo(obj2) > 0)
    {
        return obj1;
    }
    return obj2;
}

这再次使用隐式类型转换来使int成为双精度等等。这意味着你的返回类型总是一个double但是如果你想要返回int和int你可以创建重载并且编译器应该选择最好的一个

就个人而言,我建议你只使用内置的

答案 2 :(得分:1)

我认为你需要比较两种不同的类型。示例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);
        }

    }

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

答案 3 :(得分:0)

你可以用反射来做。我得到第一个类型并获得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...";
}