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-Key: 322717

Url: https://administrator.de/contentid/322717

Printed on: April 18, 2024 at 03:04 o'clock

Mitglied: 131381
Solution 131381 Dec 02, 2016 updated at 11:59:19 (UTC)
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ß
Member: atze187
Solution atze187 Dec 13, 2016 at 10:12:47 (UTC)
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
Mitglied: 117553
117553 Dec 13, 2016 at 10:40:11 (UTC)
Goto Top
Super kann ich gleich nochmal optimieren, vielen Dank euch beiden!