
117553
02.12.2016
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
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
3 Kommentare
Neuester Kommentar

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.
Gruß
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
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