Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0042: Doppelte Einträge entfernen

 von 

Beschreibung

Dieser Tipp zeigt, wie sich doppelte Einträge aus Listen entfernen lassen. Gefiltert werden die Daten und diese per Databinding an das Steuerelement gebunden.
(Selbstverständlich entsteht das hier gelöste Problem gar nicht, würde man das Hinzufügen doppelter Einträge von vornherein unterbinden.)

Zu diesem Tipp existieren im Tippupload die folgende(n) Aktualisierung(en):
[VB .NET Tippvorschlag 0038] Doppelte Einträge entfernen

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Framework 4

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008, Visual Basic 2010

Download:

Download des Beispielprojektes [7,09 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Diagnostics
'  - System.Drawing
'  - System.Windows.Forms
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Imports System.ComponentModel

Public Class Form1

    ' Dient der Wiederherstellung des Anfangs-Zustandes
    Private _Template(2000) As Integer

    ' Die zur Anzeige gebrachten Daten
    Private _UnderlyingData As New List(Of Integer)

    ' _DataSource wird als Wrapper um _UnderlyingData initialisiert. Die 
    '  Bindinglist meldet direkte Änderungen sofort an die gebundenen Controls. 
    '  Änderungen an _UnderlyingData dagegen werden nicht "bemerkt". Daher ist 
    '  in _UnderlyingData eine viel schnellere Datenverarbeitung möglich, weil 
    '  nicht bei jeder Veränderung die angebunden Controls benachrichtigt werden.
    Private _DataSource As New BindingList(Of Integer)(_UnderlyingData)

    Private Sub Form1_Load(ByVal sender As Object, _
                           ByVal e As EventArgs) Handles MyBase.Load
        Dim rnd As New Random()
        For i As Integer = 0 To _Template.Length - 1
            _Template(i) = rnd.Next(0, 300)
        Next
        _UnderlyingData.AddRange(_Template)
        ListBox1.DataSource = _DataSource
    End Sub

    Private Sub Button_Click(ByVal sender As Object, _
            ByVal e As EventArgs) Handles _
            btRestoreSource.Click, btRemoveDoubles.Click, btSort.Click
        Select Case True
            Case sender Is btRestoreSource
                _UnderlyingData.Clear()
                _UnderlyingData.AddRange(_Template)

            Case sender Is btRemoveDoubles
                RemoveDoubles(_UnderlyingData)

            Case sender Is btSort
                ' Sortieren der Items macht vorhandene Doppelungen sofort
                '  sichtbar
                _UnderlyingData.Sort()

        End Select
        _DataSource.ResetBindings() ' angebundene Controls benachrichtigen
    End Sub

    Public Sub RemoveDoubles(Of T)(ByVal lst As List(Of T))
        ' Der Algorithmus ist eigentlich ganz unnötig auf Geschwindigkeit 
        '  optimiert: Das hierauf folgende Zeichnen der Listbox wird ca. 
        '  500 - 1000 fach langsamer sein. (In VB2008 bietet übrigens die 
        '  Extension-Method "Linq.Enumerable.Distinct()" vergleichbare 
        '  Funktionalität.)
        Dim known As New Dictionary(Of T, Byte)
        Dim i As Integer = 0
        'erste Doppelung suchen
        For i = 0 To lst.Count - 1
            Dim itm As T = lst(i)
            If known.ContainsKey(itm) Then Exit For
            known.Add(itm, 0)
        Next
        ' Nach der ersten Doppelung wird der vorlaufende Zähler ii eingeführt, 
        '  und unbekannte Items werden an die Position des jetzt nachlaufenden 
        '  Zählers i kopiert
        For ii As Integer = i + 1 To lst.Count - 1
            Dim itm As T = lst(ii)
            If Not known.ContainsKey(itm) Then
                known.Add(itm, 0)
                lst(i) = itm
                i += 1
            End If
        Next
        lst.RemoveRange(i, lst.Count - i)
    End Sub

End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 10 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von khgppuc am 11.09.2010 um 16:21

W3pSAP <a href="http://lwyysytrjwce.com/">lwyysytrjwce</a>, [url=http://hjqxqfhkrfzd.com/]hjqxqfhkrfzd[/url], [link=http://wqestiebkbqx.com/]wqestiebkbqx[/link], http://mfauunwmephi.com/

Kommentar von Ekke Ese am 16.07.2007 um 19:23

RemoveDoubleEntries scheint mir unnötig kompliziert/aufwändig. Zudem sollten alle Beispiele auch so
geschrieben sein, dass sie der strengen Warnungs-/Fehlerprüfung des Visual Studio genügen.

Leicher geht es so:

Private Sub RemoveDoubleEntries(ByVal LBox As ListBox)
Dim sHsh As New Hashtable
Dim Entries1() As String = Nothing
Dim sKey As String = String.Empty
For i1 As Integer = 0 To LBox.Items.Count - 1
sKey = LBox.Items.Item(i1).ToString
If Not sHsh.ContainsKey(sKey) Then
sHsh.Add(sKey, sKey)
End If
Next
LBox.Items.Clear()
For Each sKey In sHsh.Keys
LBox.Items.Add(sKey)
Next
end Sub

Kommentar von Michael am 09.01.2007 um 17:30

Hallo!

In meinem Programm will ich ebenfalls die doppelten Einträge einer Listbox entfernen und bin durch eine Suche im Internet auf diesen Tipp gestoßen. Er klappt meiner Ansicht nach wunderbar, allerdings verstehe ich nicht alles aus diesem Tipp. Vielleicht kann mir jemand hier weiterhelfen, damit ich auch die Hintergründe begreifen kann.

Mit der Prozedur RemoveDoubleEntries habe ich Verständnisprobleme.

Hier der Teil mit dem ich Verständnisprobleme habe:

'Alle Einträge durchgehen
For i1 = 0 To UBound(Entries1)
'Flag setzen
found = False

'Alle bereits in die neue Liste eingefügten
' Einträge(durchgehen)
For i2 = 0 To UB
'Schon Initialisiert?
If Not DidInit Then
'Wenn nicht, erst Initialisieren(später)
found = False
Exit For
ElseIf Entries1(i1) = Entries2(i2) Then
'Eintrag in Liste gefunden
found = True
Exit For
End If
Next

'Wurde Eintrag in Liste gefunden?
If Not found Then
'Wurde bereits Initialisierung durchgeführt?
If Not DidInit Then
'Neue Liste auf erforderliche Größe setzen
ReDim Entries2(UBound(Entries1))
DidInit = True
End If

'In neue Liste einfügen
Entries2(UB) = Entries1(i1)

'Zähler hochsetzen. Enthält die Nummer des
' letzten Eintrags der neuen Liste.
UB = UB + 1
End If
Next

'Einmal zuviel erhöht
UB = UB - 1
'Restlichen Elemente abschneiden.
ReDim Preserve Entries2(UB)

'Liste leeren und mit neuer Liste neu füllen
LBox.Items.Clear()
For i1 = 0 To UB
LBox.Items.Add(Entries2(i1))
Next
End Sub


Kann mir einer bitte diesen mit ein, zwei Wörtern mehr erklären!

Vielen Dank.

Grüsse

Micha

Kommentar von Housewares Online Store am 23.04.2006 um 21:59

hi
Why I can not insert the image into my message?

Kommentar von Construction Tools Store am 10.04.2006 um 05:18

Good site. Me very much has liked.

Kommentar von Cycling Online Store am 05.04.2006 um 21:47

Hi
To write the letter, it is necessary ...

Kommentar von Digitalcameras Store am 02.04.2006 um 00:52

I want mp3 player. What will advise?

Kommentar von Toys Online am 26.01.2006 um 17:43

It is a site, it I understand, have tried.

Kommentar von Photoprinters Online Store am 23.01.2006 um 19:55

And how many there is a print on the photoprinter? Who knows?

Kommentar von Accessories for Cameras am 23.01.2006 um 19:19

By all hi! Good day! =)