Avatar billede driis Nybegynder
14. august 2000 - 16:52 Der er 5 kommentarer og
1 løsning

Fjerne dubletter i listbox

Jeg har en listbox, der indeholder temmelig mange elementer. Desværre må to elementer ikke være ens, og derfor har jeg brug for at checke, om værdien allerede findes i listboxen, før den tilføjes.

Det kunne selvfølgelig gøres med en For...Next løkke, der løber alle værdier igennem og sammenligner med den nye værdi. Men der er som sagt rigtig mange elementer i listboxen, så jeg tror, det kommer til at tage for lang tid at gøre det sådan. Hvordan gør man det smartere?
Avatar billede joern Nybegynder
14. august 2000 - 18:34 #1
Hej Driis.

Hvor mange.  Såvidt jeg husker er grænsen for en listbox 64 kB.  Gælder den, kunne du lave et array med de hidtidige elementer og gennemse det før en post blev tilføjet i listeboksen.  Når gennemsyn i en liste medfører at der rulles tager det uværgerligt tid.  Jeg har bemærket aten sådan funktion går væsentligt langsommere når samme program kører under win98 end under win95 ??!!

m.v.h.  Jørn
Avatar billede zaknafein Praktikant
14. august 2000 - 21:00 #2
Jeg tror godt du kan checke med et javascript, uden det bliver for tungt.
Gennemløb fx med et for-loop.

Hvor mange elementer vil du skyde på der er?
Avatar billede driis Nybegynder
14. august 2000 - 21:20 #3
Når nu joern skriver, at en listbox kun går til 64 kb (Jeg troede, det var meget mere), skal dataene nok kun gemmes til en fil og ikke føjes til en listbox. Men det gælder stadig, at den samme værdi ikke må optræde mere end én gang.

Der er tale om mere end 100000 værdier. Værdierne er strenge på mellem 6 og 40 bytes. Derfor er jeg ret sikker på, at det bliver ret tungt at gennemløbe alle data med en løkke for hver enkelt ny værdi, der tilføjes. Det må kunne gøres smartere?
Avatar billede joern Nybegynder
14. august 2000 - 22:02 #4
Hej Driis.
Denne sortering, er det noget du kun skal udføre én gang, eller vil det forekomme jævnligt?  Hvis du har access eller en anden database og indlæser dine data i den, vil der uden tvivl være en funktion til at opfange dubletter.
Ellers ville jeg lave noget kode der arbejder på filer, noget i stil med:

Dim....
Sub begynd_Click()

naeste:
dinstreng= \"næste data\" (hvor de så kommer fra?)
Open filname for input as #1
  Do while eof(1) = false
    line input #1, streng
    If dinstreng = streng Then
      close #1
      goto naeste
    End if
  Loop
close #1
open filname for append as #1
  print #1, dinstreng
close #1
goto naeste

End sub

Med 100000 poster vil der nok gå 1 times tid, afhængig af CPU og antal dubletter - jo flere jo hurtigere.

M.v.h.  Jørn
Avatar billede zaknafein Praktikant
14. august 2000 - 22:46 #5
Læg dem i DB i lav et recordset hvor du trækker alle poster ud med værdien, og hvis RS.RecordCount > 0, ja så er der en i forvejen. På denne måde vil SQL kaldet ordne det for dig. Du kan eventuelt indexere feltet i DB\'en!
Avatar billede tomasc Nybegynder
17. august 2000 - 23:33 #6
I VB har du 2 objekter, som kan hjælpe dig i mange situationer:

Collection
Dictionary (findes i Microsoft Scripting Runtime)

Hvis du, hver gang du tilføjer en linie til din listbox, også tilføjer den til en Collection eller et Dictionary, kan du let OG MEGET HURTIGT checke om den skulle eksistere i forvejen.

Jeg giver dig her (skrabede) eksempel på hvordan det kan se ud - både med Collection og med Dictionary:

Private Col As New Collection
Private Dic As New Dictionary

Private Function colDublet(ByVal S As String) As Boolean
    On Error GoTo ErrHandler
    Col.Add Null, S
    colDublet = False
    Exit Function
ErrHandler:
    colDublet = True
End Function

Private Function dicDublet(ByVal S As String) As Boolean
    If Dic.Exists(S) Then
        dicDublet = True
    Else
        dicDublet = False
        Dic.Add S, Null
    End If
End Function

Private Sub Form_Load()
    If colDublet(\"Test\") Then MsgBox \"1. colDublet har fundet dublet\"
    If colDublet(\"Test\") Then MsgBox \"2. colDublet har fundet dublet\"
    If dicDublet(\"Test\") Then MsgBox \"3. dicDublet har fundet dublet\"
    If dicDublet(\"Test\") Then MsgBox \"4. dicDublet har fundet dublet\"
End Sub

Der skulle gerne kunne findes dubpletter i linie 2 og 4 (og ikke i 1 og 3).
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