如何比较两个对象,无论vb.net中的数据类型如何

时间:2010-10-12 10:16:35

标签: c# .net vb.net

正如标题所暗示的,我想比较两种类型可能不同的对象。

例如, 我希望将1000.0(十进制)与1000(双精度)进行比较的'真'。 同样,如果我比较10(字符串)和10(双),它应该返回true。

我尝试使用Object.Equals()进行比较,但它不起作用。如果两个对象具有不同的数据类型,则返回false。

Dim oldVal As Object  ' assgin some value
Dim newVal As Object  'assgin some value
If Not Object.Equals(oldVal,newVal) Then
  'do something
End If

修改 如果我这样做可以吗?

    1.check the type of oldVal
    2.Covert the type of newVal to oldVal
    3.Compare.

5 个答案:

答案 0 :(得分:1)

试试这个:

Dim oldVal As Object  'assgin some value
Dim newVal As Object  'assgin some value
Dim b As Boolean = False

If IsNumeric(oldVal) And IsNumeric(newVal) Then
    b = (Val(oldVal) = Val(newVal))
ElseIf IsDate(oldVal) And IsDate(newVal) Then
    b = (CDate(oldVal) = CDate(newVal))
Else
    b = (oldVal.ToString() = newVal.ToString())
End If

If Not b Then
    'do something
End If

或者像这样使用IIf:

If Not CBool(IIf(IsNumeric(oldVal) And IsNumeric(newVal), 
                  (Val(oldVal) = Val(newVal)),
                  IIf(IsDate(oldVal) And IsDate(newVal), 
                     (CDate(oldVal) = CDate(newVal)), 
                     (oldVal.ToString() = newVal.ToString())))) Then
    'do something
End If

答案 1 :(得分:0)

混合梨和苹果? :) Equals进行等式比较(参考平等的Equals测试的eefault实现)。而“=”进行身份比较。

如果您需要一个不同的行为来比较两个对象,那么定义一个Equals方法和/或一个CompareTo方法。

要将整数与双精度数比较,您必须(隐式或显式)转换两个操作数之一。

dim i as integer = 1000
dim d as double = 1000.0

return i = CInt(d)

答案 2 :(得分:0)

Object.Equals认为两个值对象在(a)具有相同的二进制表示和(b)按位相等时是相等的,因此对于不同的值类型,它总是会返回false。

您可以尝试使用Convert.ToDouble将所有值转换为double,然后比较双值,如果这适合您的任务;准备好通过转换捕获可能的异常。

答案 3 :(得分:0)

如果使用Option Strict Off,您基本上已经描述了VB.Net的标准行为?所以只需使用Option Strict Off,然后编写a = b

事实上我建议你不要这样做因为它很可能会引入错误:)你能解释一下为什么你需要这种行为吗?

答案 4 :(得分:0)

有几种方法可以做到这一点,下面是我觉得最接近你正在寻找的那个,但我个人认为这不是一个很好的方法来构建你的解决方案。


Dim fooObj As New Foo
Dim barObj As New Bar

fooObj.Value = 10
barObj.Value = 10

System.Diagnostics.Debug.WriteLine(barObj.Equals(fooObj))
System.Diagnostics.Debug.WriteLine(barObj.Equals(barObj))
System.Diagnostics.Debug.WriteLine(barObj.Equals(10))
System.Diagnostics.Debug.WriteLine(barObj.Equals(20))
System.Diagnostics.Debug.WriteLine(barObj.Equals("10"))
System.Diagnostics.Debug.WriteLine(barObj.Equals("20"))

System.Diagnostics.Debug.WriteLine(Object.Equals(barObj, 10))

Public Class Foo
    Public Value As Integer
End Class

Public Class Bar
    Public Value As Integer

    Public Overrides Function Equals(ByVal obj As Object) As Boolean

        If TypeOf obj Is Bar Then
            Dim compareBar As Bar = DirectCast(obj, Bar)

            Return MyClass.Value = compareBar.Value

        ElseIf TypeOf obj Is Foo Then
            Dim compareFoo As Foo = DirectCast(obj, Foo)

            Return MyClass.Value = compareFoo.Value

        ElseIf TypeOf obj Is Integer Then
            Dim compareInt As Integer = DirectCast(obj, Integer)

            Return MyClass.Value = compareInt

        ElseIf TypeOf obj Is String Then
            Dim compareString As String = DirectCast(obj, String)

            Return MyClass.Value.ToString() = compareString
        End If



        Return False

    End Function
End Class