Avatar billede Slettet bruger
10. september 2006 - 14:06 Der 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?
Avatar billede nielle Nybegynder
10. september 2006 - 14:23 #1
Lyder mystisk. Kan du prøve at give et lille kodeeksempel?
Avatar billede Slettet bruger
10. september 2006 - 14:34 #2
Når jeg f.eks. fylder en list fra en database:

  If Not LovDokumentList.Contains(objLovDokumnet) Then
      LovDokumentList.Add(objLovDokumnet)
  End If
Avatar billede nielle Nybegynder
10. september 2006 - 14:43 #3
Hvor går det noget galt i det viste eksempel?
Avatar billede Slettet bruger
10. september 2006 - 15:06 #4
At selv om "objLovDokumnet" er i "LovDokumentList" tilføjes "objLovDokumnet" alligevel
Avatar billede nielle Nybegynder
10. september 2006 - 15:19 #5
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).
Avatar billede 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"?
Avatar billede nielle Nybegynder
10. september 2006 - 15:51 #7
Hvis du ikke ønsker dublet-værdier i din liste, så kan du undgå det allerede i dit SQL-kald vha koden DISTINCT:

SELECT DISTINCT dokumentNr FROM dokumentTabel
Avatar billede Slettet bruger
10. september 2006 - 20:32 #8
Det duer ikke rigtigt i mit tilfælde, da jeg løber gennem databasetabellen et par gange.
Avatar billede nielle Nybegynder
10. september 2006 - 21:56 #9
Det forstår jeg ikke. Hvad skulle DISTINCT sabotere mht. dette?
Avatar billede arne_v Ekspert
10. september 2006 - 22:33 #10
har din LovDokument klasse en Equals (og GetHashCode) metode ?

det er nødvendigt for at Contains virker
Avatar billede arne_v Ekspert
05. oktober 2006 - 02:54 #11
anthonsen ?
Avatar billede Slettet bruger
06. oktober 2006 - 09:18 #12
Hej

Jeg røg lige væk det, men jeg har stadig problemet.

Min klasse har ikke Equals (og GetHashCode) metode, så det skal jeg vel lave. Har du et standard eks liggende?
Avatar billede arne_v Ekspert
07. oktober 2006 - 00:10 #13
Imports System
Imports System.Collections.Generic

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
Avatar billede arne_v Ekspert
10. december 2006 - 00:44 #14
anthonsen ?
Avatar billede Slettet bruger
28. december 2006 - 01:30 #15
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?
Avatar billede arne_v Ekspert
28. december 2006 - 01:43 #16
selvfølgelig
Avatar billede Slettet bruger
28. december 2006 - 02:36 #17
Jeg skal vist lige tilbage på sporet igen:

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?
Avatar billede arne_v Ekspert
28. december 2006 - 02:40 #18
re 1)

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
Avatar billede 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
Avatar billede arne_v Ekspert
28. december 2006 - 02:52 #20
du vedtager med dig selv hvilke af de properties der skal være ens for at du
betragter objekterne som ens
Avatar billede Slettet bruger
28. december 2006 - 02:58 #21
Ok, men er det ikke muligt at sammenligne to objekter? I mit tilfælde kan der nemlig være forskel på hvilke properties der er forskellige.
Avatar billede arne_v Ekspert
28. december 2006 - 03:02 #22
det er muligt at sammenligne 2 objekter

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å
Avatar billede 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.

Sender du et svar?
Avatar billede arne_v Ekspert
28. december 2006 - 04:03 #24
der er næsten altid en eller anden form for unikt id (i database sprog: en primary key)

og et svar
Avatar billede Slettet bruger
28. december 2006 - 11:25 #25
Tak for hjælpen - og tålmodigheden.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester