14. august 2000 - 16:52Der 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?
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 ??!!
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?
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.
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!
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).
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.