door zoeken van ArrayList /Structure

Status
Niet open voor verdere reacties.

avbergen

Nieuwe gebruiker
Lid geworden
12 dec 2010
Berichten
4
Ik heb de volgende code om een array te doorzoeken. Het lijkt goed te gaan, alleen ondanks de
"If InstanceofMyClass3.Hex = arrSBSRecord(4) Then" worden er toch nog records toegeveogd aan myarraylist.

Wellicht is er een veel slimmer manier om mijn probleem op te lossen (dan hoor ik dat ook graag ;-)) of er zit een fout in mijn code. Heeft iemand een idee?

Albert



Public Structure mystruct
Public Hex As String
Public Location As String
Public DateS As String
Public TimeS As String
Public Lat As String
Public Lng As String
Public Alt As String
Public Head As String
Public Callsign As String
Public Squawk As String
Public LastUpdate As String
End Structure

Dim myarraylist As New ArrayList()
Dim InstanceofMyClass As mystruct

'if no records in myarraylist add first received code.

If myarraylist.Count = 0 Then
If arrSBSRecord(1) = "1" Then
With InstanceofMyClass
.Hex = arrSBSRecord(4)
End With
End If
'add new record to myarraylist
myarraylist.Add(InstanceofMyClass)
myarraylist.TrimToSize()
Else

'loop through records (for = 0 To myarraylist.Count - 1

Gevonden = False
For i = 0 To myarraylist.Count - 1
InstanceofMyClass3 = CType(myarraylist(i), mystruct)

'If record allready exist in myarraylist then update Instance

If InstanceofMyClass3.Hex = arrSBSRecord(4) Then
Console.WriteLine("Update: " & InstanceofMyClass3.Hex)
'update instance
Gevonden = True
Exit For
End If

'If now record is found in myarraylist then add to myarraylist

If (Not Gevonden) And (i = 0) Then
If arrSBSRecord(1) = "1" Then
With InstanceofMyClass
.Hex = arrSBSRecord(4)
End With
myarraylist.Add(InstanceofMyClass)
myarraylist.TrimToSize()
End If
Exit For
End If
Next
End If
 
Zet de code even tussen code tages, zodat het wat leesbaarder wordt. Voor de rest is mij het doel van deze code een beetje onduidelijk.

Er wordt een nieuwe array aangemaakt en vervolgens wordt er gecontroleerd of count 0 is? ArrSBSRecord komt helemaal niet voor? Wat is het? Danwel ik heb het idee dat we de helft missen.... :(

Enige nuttige wat ik er over kan zeggen is pas Ctype aan naar DirectCast.

Code:
InstanceofMyClass3 = DirectCast(myarraylist(i), mystruct)
 
Zet de code even tussen code tages, zodat het wat leesbaarder wordt. Voor de rest is mij het doel van deze code een beetje onduidelijk.

Er wordt een nieuwe array aangemaakt en vervolgens wordt er gecontroleerd of count 0 is? ArrSBSRecord komt helemaal niet voor? Wat is het? Danwel ik heb het idee dat we de helft missen.... :(


Code:
InstanceofMyClass3 = DirectCast(myarraylist(i), mystruct)

Mark,
Alvast bedankt voor het kijken.
Er mist inderdaad een stuk van de code. Ik zal proberen het e.a. wat beter toe te lichten.

De software leest een bepaalde port uit. Op die port komt er een continue stroom binnen aan data. (Dit is de ArrSBSRecord ). Een data bevat een "unieke" code. Op het moment dat er een code aankomt die al in de array zit, moet het record worden geupdate. Anders moet de "unieke" code toe worden gevoegd aan de array.

De data die ik per code wil bij houden is:

Code:
Public Structure mystruct
Public Hex As String
Public Location As String
Public DateS As String
Public TimeS As String
Public Lat As String
Public Lng As String
Public Alt As String
Public Head As String
Public Callsign As String
Public Squawk As String
Public LastUpdate As String
End Structure

Op het moment dat ik de port ga uitlezen is de array nog leeg en voeg ik het eerste record toe.

Code:
If myarraylist.Count = 0 Then
                If arrSBSRecord(1) = "1" Then
                    With InstanceofMyClass
                        .Hex = arrSBSRecord(4)
'hier heb ik nu wat code weglaten. Dit betreft de overige velden van het record die ik bij wil houden.

                    End With
                End If
                'add new record to myarraylist
                myarraylist.Add(InstanceofMyClass)
                myarraylist.TrimToSize()
            Else

Middels de volgende code wil ik de array doorlopen om te achterhalen of de "unieke" code al in de array aanwezig is. Is die aanwezig dan moet het record worden geupdated. Is die niet aanwezig dan moet de "unieke" code worden toegevoegd.

Code:
Gevonden = False
                For i = 0 To myarraylist.Count - 1
                    InstanceofMyClass3 = CType(myarraylist(i), mystruct)
                
'If  record allready exist in myarraylist then update Instance
                    If InstanceofMyClass3.Hex = arrSBSRecord(4) Then
                        Console.WriteLine("Update: " & InstanceofMyClass3.Hex)
'update instance
                        Gevonden = True
                        Exit For
                    End If

'If now record is found in myarraylist then add to myarraylist
                    If (Not Gevonden) And (i = 0) Then
                        If arrSBSRecord(1) = "1" Then
                            With InstanceofMyClass
                                .Hex = arrSBSRecord(4)
                            End With
                            myarraylist.Add(InstanceofMyClass)
                            myarraylist.TrimToSize()
                        End If
                        Exit For
                    End If
                Next

In sommige gevallen wordt middels If InstanceofMyClass3.Hex = arrSBSRecord(4) Then een record gevonden en dus geupdated, maar soms (ondanks dat de unieke code in de array zit) wordt de unieke code toegevoegd.

Hopelijk is het zo iets duidelijkere. Zo niet, dan hoor ik het graag.

Albert
 
De vraag is denk ik wel duidelijk. Zal vanavond even kijken of ik een antwoord kan geven waar je wat mee kan. Maar even voor mijn nieuwsgierigheid. Van wat voor apparaat, welke poort krijg je die dat binnen?
 
De vraag is denk ik wel duidelijk. Zal vanavond even kijken of ik een antwoord kan geven waar je wat mee kan. Maar even voor mijn nieuwsgierigheid. Van wat voor apparaat, welke poort krijg je die dat binnen?

Alvast bedankt voor de tijd die je er aan wilt besteden.

Data komt vanaf een Radarbox/SBS-1. Hiermee kan je bepaalde gegevens van vliegtuigen ontvangen.

Albert
 
Ik zou om te beginnen geen aparte array maken of daar vervolgens een nieuw object in te stoppen, maar een List maken van de structure.
Code:
'''Dim myarraylist As New ArrayList() wordt:
Dim myList as New List(Of MyStruct)

Vervolgens:
Code:
If myList.Count = 0 Then
                If arrSBSRecord(1) = "1" Then
myList.Add(New mystruct With {.Hex=arrSBSRecord(4), etc})
'hier heb ik nu wat code weglaten. Dit betreft de overige velden van het record die ik bij wil houden.
End If
            Else

Daarna dmv linq checken of de hex wel of niet voorkomt.

Code:
Dim record = (From m In myList
                      Where m.Hex = arrSBSRecord(4)
                      Select m).FirstOrDefault

If Not record is Nothing Then
 'update record
Else
 'toevoegen aan list

End If
 
Laatst bewerkt:
Ik zou om te beginnen geen aparte array maken of daar vervolgens een nieuw object in te stoppen, maar een List maken van de structure.
Code:
'''Dim myarraylist As New ArrayList() wordt:
Dim myList as New List(Of MyStruct)

Vervolgens:
Code:
If myList.Count = 0 Then
                If arrSBSRecord(1) = "1" Then
myList.Add(New mystruct With {.Hex=arrSBSRecord(4), etc})
'hier heb ik nu wat code weglaten. Dit betreft de overige velden van het record die ik bij wil houden.
End If
            Else

Daarna dmv linq checken of de hex wel of niet voorkomt.

Code:
Dim record = (From m In myList
                      Where m.Hex = arrSBSRecord(4)
                      Select m).FirstOrDefault

If Not record is Nothing Then
 'update record
Else
 'toevoegen aan list

End If

Mark,

Bedankt voor deze oplossing. Ik loop hier echter ook tegen een probleem aan dat ik blijkbaar continue veel te veel data moet verwerken. Ik heb het programma omgezet naar DataTable. Met een primaire key heb ik nu een extra zekerheid dat er geen waarde dubbel worden ingevoerd.

Albert
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan