一般比较两个对象

本文关键字:两个 对象 比较 | 更新日期: 2023-09-27 18:35:30

我知道

一个幼稚的问题,经过两年的经验,我坚持回答它。

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

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

我想称它为整数,短,短,浮点数,双精度,...等等我真正坚持如何比较 obj1 和 obj2 我不能按照上面的方式写它我知道这很幼稚,但我不知道

一般比较两个对象

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

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

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

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

有一个内置的解决方案可以做你想要的,Math.Max(MSDN 文档):

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

这再次使用隐式类型转换将整数转换为双精度等。这意味着您的返回类型始终是双精度型,但如果您想返回 ints 和 int,您可以创建重载,编译器应该选择最好的一个。

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

我认为您需要比较两种不同的类型。示例整数和十进制。

    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将是你期望的结果类型(十进制、双精度等)。

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