10. september 2006 - 14:06Der er
24 kommentarer og 1 løsning
Problemer med list(of mitObject) og metoden contains
Hej
Jeg har en list(of mineObjecter), men når jeg bruger metoden contains, finder den aldrig det object, selv om jeg er helt sikker på at det er indeholdt i listen. Er der en umiddelbar forklaring på det?
Hvis du udtrækker fra en database og opretter et objLovDokumnet for hver række, så er det ikke det samme objekt (selv om de indeholder det samme data).
Synes godt om
Slettet bruger
10. september 2006 - 15:42#6
Ok. Er der en måde at sammenligne på, eller skal man gå ind og sammenligne på f.eks. et id på "objLovDokumnet"?
Namespace E Public Class A Private _s As String Public Sub New() Me.New("") End Sub Public Sub New(ByVal s As String) _s = s End Sub Public Property S() As String Get Return _s End Get Set _s = value End Set End Property Public Overloads Overrides Function ToString() As String Return s End Function End Class Public Class B Private _s As String Public Sub New() Me.New("") End Sub Public Sub New(ByVal s As String) _s = s End Sub Public Property S() As String Get Return _s End Get Set _s = value End Set End Property Public Overloads Overrides Function ToString() As String Return s End Function Public Overrides Function Equals(o As Object) As Boolean If TypeOf o Is B Then If _s = CType(o, B).S Then Return True Else Return False End If Else Return False End If End Function Public Overrides Function GetHashCode() As Integer Return _s.GetHashCode() End Function End Class Public Class MainClass Public Shared Sub Main(ByVal args As String()) Dim lst1 As List(Of A) = New List(Of A) lst1.Add(new A("test")) Console.WriteLine(lst1.Contains(New A("test"))) Dim lst2 As List(Of B) = New List(Of B) lst2.Add(new B("test")) Console.WriteLine(lst2.Contains(New B("test"))) End Sub End Class End Namespace
Sorry - jeg er der. Jeg har haft travlt med andet. Jeg påregner at løse ovenstående problem i løbet af nogle dage. Jeg vender tilbage med enten point eller uddybedne spørgsmål hvis det er i orden?
Spm 1) Er det min Lovdokument-klasse, der skal indeholde metoderne Equals og GetHashCode eller er det en anden klasse, der ikke laver andet end at sammenligne lovdokumenter?
Spm 2) Under antagelse af at det er Lodokument-klassen, der skal indeholde metoderne, kan den så sidestilles med din Class B i dit eksempel og Class A er kun til illustration?
hvis det er instanser af Lovdokument du gemmer i din collection, så er det den du skal give Equals og Hashcode
A viser hvornår det ikke virker
B viser hvornår det virker
så ja: B
Synes godt om
Slettet bruger
28. december 2006 - 02:48#19
Tak.
Men jeg kan ikke se hvordan nedenståeden erstattes, når jeg I mit tilfælde har flere og forskellige properties:
Public Overloads Overrides Function ToString() As String Return s End Function Public Overrides Function Equals(o As Object) As Boolean If TypeOf o Is B Then If _s = CType(o, B).S Then Return True Else Return False End If Else Return False End If End Function Public Overrides Function GetHashCode() As Integer Return _s.GetHashCode() End Function
default sammenligner .NET om de ligger samme sted i memory
vil du have en anden funktionalitet må du selv definere den
hvis du havde en person klasse ville du f.eks. sammenligne CPR nummer - hvis CPR er det samme så er det samme person - uanset om de 2 objekter har skjortefarve til henholdsvis rød og blå
Synes godt om
Slettet bruger
28. december 2006 - 03:36#23
Tak. Jeg kom til at tænke på at jeg har jo id - det er jo forskelligt på alle lovdok.
der er næsten altid en eller anden form for unikt id (i database sprog: en primary key)
og et svar
Synes godt om
Slettet bruger
28. december 2006 - 11:25#25
Tak for hjælpen - og tålmodigheden.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.