C# 一般比较两个对象
我知道这是一个幼稚的问题,经过两年的经验,我坚持要回答这个问题 简单地说,我需要创建一个通用方法,该方法可以使用int、double、float并比较它们,然后找到更大的值: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
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);
}
}