BinarySearch - 无法比较数组中的两个元素

时间:2016-04-08 20:46:28

标签: vb.net .net-4.0 binary-search invalidoperationexception .net-1.1

所以我们最近将一个应用程序从.NET 1.1迁移到了.NET 4.0。 有了这个,我们必须修复一系列兼容性问题。 其中之一就是一段代码正在抛出InvalidOperationException

Public Function MyFunction(ByVal Params As myParams, ByVal ParamArray someNumber As Integer()) As myData

   ...

   If someNumber.BinarySearch(options, MyEnum.Something) >= 0 Then
        ...
   EndIf

   ...

EndFunction

在我们迁移到.NET4之前,这在.NET1中正常运行。现在基于我一直在阅读的一些主题,有关于这个问题的报道已在.NET4.5中得到修复。为了解决这个问题,我必须在数组的所有元素上实现IComparable接口。

我该如何解决这个问题?我会很感激任何帮助和指针。谢谢!

编辑:添加我们在代码中使用的BinarySearch方法的链接。 https://msdn.microsoft.com/en-us/library/y15ef976.aspx

3 个答案:

答案 0 :(得分:0)

  1. Implements IComparable IComparable Interface添加到您的班级定义中。 2.为班级添加IComparable.CompareTo的方法。借用msdn:

    Public Class Temperature
        Implements IComparable
        ' The temperature value
        Protected temperatureF As Double
    
    Public Overloads Function CompareTo(ByVal obj As Object) As Integer _
    Implements IComparable.CompareTo
    
        If obj Is Nothing Then Return 1
        Dim otherTemperature As Temperature = TryCast(obj, Temperature)
        If otherTemperature IsNot Nothing Then
            Return Me.temperatureF.CompareTo(otherTemperature.temperatureF)
        Else
          Throw New ArgumentException("Object is not a Temperature")
        End If   
    End Function
    
    ....
    
    End Class
    
  2. 比较粗略的,CompareTo函数中的代码取决于你的类(你没有提供太多的东西)。所有数字类型(如Int32和Double)都实现IComparable,String,Char和DateTime也是如此。自定义类型还应提供自己的IComparable实现,以便对对象实例进行排序或排序。我相信你的情况可能就是这种情况。我希望这会有所帮助。

答案 1 :(得分:0)

试试这个:

   ...
   Array.Sort(Of Integer)(someNumber)  ' only if someNumber is not previously sorted
   If Array.BinarySearch(Of Integer)(someNumber, MyEnum.Something) >= 0 Then
     ...
   End If
...

这应该适用于所有.NET框架> 2.0。

答案 2 :(得分:0)

How do I go about to fixing this?

您没有正确使用它。 BinarySearch是一个共享/静态方法,在尝试将其用作实例方法时不会在Intellisense中显示:

enter image description here

如果你输入它,你会得到一个新的编译器警告:通过实例访问共享成员...将不会被评估。 MSDN没有任何针对.NET 1.1的内容,所以我不知道从那以后它是否发生了变化(可疑)。正确用法:

IndexOf6 = Array.BinarySearch(myIntAry, 6)

这引出了一个问题,作为从.NET 1.x到4.5的转换的一部分,为什么不将其转换为List(Of Int32)。快速测试表明IndexOf()方法的速度提高了2-3倍:

IndexOf6 = intList.IndexOf(6)

List<T>方法也更独立&#39;因为与System.Array不同,所以不需要对其进行排序以便工作。