-3

dizisindeki iki öğeyi karşılaştırılamadığından, bir uygulamayı .NET 1.1'den .NET 4.0'a taşıdık. Ve bununla, düzeltmemiz gereken bir dizi uyumluluk sorunu vardı. Bunlardan biri, bir kod bloğunun InvalidOperationException'u atmasıdır.BinarySearch -

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'e geçmeden önce, bu .NET1'de düzgün çalışıyordu. Şimdi okuduğum bazı konulara dayanarak, .NET4.5'te giderilen bu sorun hakkında raporlar çıktı. Ve şu anki sürümde bunu düzeltmek için, IComparable arabirimini dizinin tüm öğelerine uygulamak zorundayım.

Bunu düzeltmek için nasıl giderim? Herhangi bir yardım ve işaretçi için minnettarım. Teşekkürler!

DÜZENLEME: Bağlantıyı BinarySearch yöntemine ekleyerek kodda kullanıyoruz. https://msdn.microsoft.com/en-us/library/y15ef976.aspx

+0

Karşılaştırmaları yapan ikili arama kodunu görebilir miyiz? – codemonkeyliketab

+0

System.Array öğesinde yerleşik bir işlev var. – Smiley

+0

Hangisi?Size yardımcı olacak daha fazla bilgiye ihtiyacımız var. – codemonkeyliketab

cevap

0
  1. sınıf tanımına Implements IComparableIComparable Interface ekleyin. 2. Sınıf için IComparable.CompareTo için bir yöntem ekleyin. msdn borç: CompareTo işlevinde kodu sınıfına bağlıdır kaba Of

    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 
    

(sen elimizde pek vermedi). Tüm sayısal türler (Int32 ve Double gibi), String, Char ve DateTime gibi IComparable uygular. Özel türler, nesne örneklerinin sıralanmasını veya sıralanmasını sağlamak için IComparable'ın kendi uygulamasını da sağlamalıdır. Senin durumundaki durumun olabileceğine inanıyorum. Umarım bu yardımcı olur.

0

bu deneyin: Bu, tüm NET çerçeveler> 2.0 çalışmalıdır

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

.

0

How do I go about to fixing this?

Sen doğru kullanmıyorsunuz. Paylaşılan üyesinin Erişim: Eğer yine de bunu yazarsanız

enter image description here

, yeni bir derleyici uyarı alıyorum: BinarySearch örnek yöntemi olarak kullanmak için IntelliSense bir Paylaşılan/statik yöntem ve doesnt gösterisi çalıştığında ... bir örnekle ... değerlendirilmeyecek. MSDN, NET 1.1 için bir şey yok, o zamandan beri değişmiş olup olmadığını bilmiyorum (şüpheli). Doğru kullanım:

dönüşüm kapsamında NET 1.x ilâ 4.5, soru yalvarır
IndexOf6 = Array.BinarySearch(myIntAry, 6) 

, neden List(Of Int32) bu dönüştürmez. Hızlı bir deney IndexOf() yöntem 2-3 kat daha hızlı olduğunu gösteriyor:

IndexOf6 = intList.IndexOf(6) 

List<T> yöntem ayrıca System.Array aksine, çalışmak için sırayla sıralanması gerekmez çünkü daha 'bağımsız' olduğunu.