一般比较两个对象
本文关键字:两个 对象 比较 | 更新日期: 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。因此,您可以互换使用 int
、float
和 double
,它将返回适当类型的适当值(例如,如果传递 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...";
}