117553
Goto Top

Vb.net Listview doppelte einträge löschen und Anzahl der mehrfachen Einträge in Spalte 2 übernehmen

Hallo zusammen, ich komm einfach nicht weiter vielleicht kann mir jemand von euch helfen.....

ich durchsuche eine relativ große Ordnerstruktur und lasse die Dateinamen in eine Listview eintragen.
danach durchsuche ich die LV und lösche doppelte Einträge...
jetzt möchte ich die gelöschten Elemente zu jedem Namen aber zählen und die Anzahl dahinter in Spalte 2 (also wie oft der mehrfache Name vorkam) eintrragen aber da steck ich fest face-sad


Code:

For Each Item As String In My.Computer.FileSystem.GetFiles(PATHre & "\", FileIO.SearchOption.SearchAllSubDirectories, "*.pdf")
' With ListView2.Items.Add(Item )
ListView2.Items.Add(System.IO.Path.GetFileName(Item))
ListView2.Sorting = SortOrder.Ascending

Next Item

For i = 0 To ListView2.Items.Count - 1 'Gehe alle Einträge der ListView durch

firstline:

For x = (i + 1) To ListView2.Items.Count - 1 'Gehe alle Einträge der ListView ab dem nächsten Element durch

If ListView2.Items(i).Text.ToLower.ToString = ListView2.Items(x).Text.ToLower.ToString Then 'Wenn das aktuelle Element (i) dem nächsten entspricht...
c = c + 1

ListView2.Items.RemoveAt(x) '... dann lösche das nächste Element

' ListView2.SubItems.add(c)

GoTo firstline
End If

Next x

'end with

Next i
'next item

Label6.Text = ListView2.Items.Count & " verschiedene Teile reklamiert"

ListView2.Refresh()
Cursor.Current = Cursors.Default

Content-ID: 322717

Url: https://administrator.de/forum/vb-net-listview-doppelte-eintraege-loeschen-und-anzahl-der-mehrfachen-eintraege-in-spalte-2-uebernehmen-322717.html

Ausgedruckt am: 03.04.2025 um 16:04 Uhr

131381
Lösung 131381 02.12.2016 aktualisiert um 12:59:19 Uhr
Goto Top
Moin,
mach es anders und zwar so das du schon beim Einlesen die Dateinamen gegen eine Hashtable prüfst. Ist dort der Name schon hinterlegt addierst du eine 1 ins Value des Hashtable Keys, ist er noch nicht vorhanden erstellst du einen weiteren Eintrag in der Hashtable mit dem Wert 1.
Zum Schluss schreibst du die Werte der Hashtable mit einer For-Schleife in dein Grid, fertig.
Das ist zielgerichteter und effektiver als hinterher erst die Zeilen im GV zu durchlaufen.
Dim fileCollection As New Hashtable
For Each file As String In My.Computer.FileSystem.GetFiles("C:\OrdnerXYZ", FileIO.SearchOption.SearchAllSubDirectories)  
    Dim filename As String = IO.Path.GetFileName(file)
    If Not fileCollection.Contains(filename) Then
        fileCollection.Add(filename, 1)
    Else
        fileCollection(filename) += 1
    End If
Next
For Each key In fileCollection.Keys
    lv.Items.Add(New ListViewItem({key, fileCollection(key)}))
Next
Gruß
atze187
Lösung atze187 13.12.2016 um 11:12:47 Uhr
Goto Top
Das was mikrotik sagt, aber mit weniger Code:

        Dim dir As DirectoryInfo = New DirectoryInfo("c:\tmp")  
        Dim files = dir.GetFiles("*.*", SearchOption.AllDirectories).GroupBy(Function(f As FileInfo) f.Name)  

        For Each grouping As IGrouping(Of String, FileInfo) In files
            ListView2.Items.Add(New ListViewItem({grouping.First().Name, grouping.Count()})) 
        Next
117553
117553 13.12.2016 um 11:40:11 Uhr
Goto Top
Super kann ich gleich nochmal optimieren, vielen Dank euch beiden!