如何在.NET中比较两个带方框的数字是否相等?

如何在.NET中比较两个带方框的数字是否相等?,.net,numbers,equality,.net,Numbers,Equality,假设我有以下完全没有意义的代码: object val1 = 1; object val2 = 1l; 以下将返回false,因为两个装箱对象不同,因为它们具有不同的类型: val1 == val2 这同样适用于: val1.Equals(val2) 或: 考虑到我不知道运行时的类型(因此无法强制转换),以与下面相同的方式比较这些类型的最简单方法是什么 换言之,如何根据两个装箱的数字进行值比较?如果您不知道类型,那么我认为您必须进行一些思考,以确定需要什么样的数据比较方法 如果它是一种特定

假设我有以下完全没有意义的代码:

object val1 = 1;
object val2 = 1l;
以下将返回false,因为两个装箱对象不同,因为它们具有不同的类型:

val1 == val2
这同样适用于:

val1.Equals(val2)
或:

考虑到我不知道运行时的类型(因此无法强制转换),以与下面相同的方式比较这些类型的最简单方法是什么


换言之,如何根据两个装箱的数字进行值比较?

如果您不知道类型,那么我认为您必须进行一些思考,以确定需要什么样的数据比较方法

如果它是一种特定类型的对象,则可以使用
.Equals()
方法检查相等性-支持它的标准.Net类型之一,或者将它添加到您自己的对象中

如果做不到这一点,您可以将它们转换为已知类型,前提是您事先知道它将是什么

来自cdhowie的好观点,所以


我可能遗漏了一些东西,但你知道它们是问题/标签标题中的数字-除非你有一些用于存储数字的自定义类型,否则你不能简单地将所有内容转换为Long(或ULong,如果仅+ve),然后进行比较吗?

我查看了System.ValueType.Equals(obj,obj)

但是,使用Reflector可以看到,如果类型不匹配,该方法会专门返回false

您可以尝试扩展自己的方法,例如,object.ValueEquals(obj,obj),使用Reflector中的代码并取消该检查

值得一试。

尝试使用动态关键字。它将对象解析为您的值类型,以便您可以使用==运算符并比较真实值:

(dynamic)val1 == (dynamic)val2

注意OP说“我不知道运行时的类型(因此不能强制转换)”-1实际上没有回答这个问题。(OP询问如何在事先不知道类型的情况下比较相等,并指出
.Equals()
方法对不同类型的盒式数字不起作用。)K,删除了downvote,但我想指出更多的事情:(1)强制转换到
long
并不总是有效(如果装箱的数字是具有不同分数成分的
双精度
浮点型
,)和(2)
.Equals()
将不总是有效。例如,这将返回false!
1.Equals(1L)
我想得到等效的比较-一些可能是
长的
,一些可能是
十进制的
,一些可能是
双的
-然后我必须将所有的都转换为
双的
,但这可能会截断我想要的
长的
avoid@joshcomley-那样的话,我看你不能在应用适当的强制转换之前,不要测试两者的类型并确定它们是否具有可比性,然后进行比较…长数不会捕获浮点数,浮点数可能溢出长数,等等…-您可以测试它们是否都是整数并应用长数。如果它们都是分数,请使用浮点数-但永远不可能比较使用标准数据类型,您可以编写自己的类,该类接受构造函数中的一个对象,并设置几个内部字段中的一个。@joshcomley[cont]-一个long,一个float,等等,并重写equals操作符来获取另一个类-然后为各种不同的场景提供一些自定义逻辑。我猜你最终会得到3种状态-equals,equals,unquality,not compare。我假设一开始就不可能避免将它们装箱?我肯定你知道long/Integer/etc.
.TryParse()
如果你走这条路,它会派上用场我不太明白。为什么不管你怎么写表达式,1==11都会返回真值?它是(int)1==(long)1。他使用的是一个L而不是一个额外的1。你至少知道它们是否总是某种形式的数字?(数字作为标记)它是1==1L,joshcomley没有注意到编译器的警告,“l”后缀很容易与数字“1”混淆——为了清晰起见,请使用“l”。您正在尝试比较鱼和青蛙。您必须先淹死青蛙,才能进行有意义的比较。为了避免淹死自己,需要在这两个后缀上都使用Convert.ToInt64。
1 == 1l;
(dynamic)val1 == (dynamic)val2