none
Doppelte Einträge verhindern RRS feed

  • Frage

  • Hallo,

    Ich würde es gerne schaffen, dass man in die ListBox keine Doppelten Einträge sowie keine Leeren Items also Items nur mit Leertaste reinbekommt wenn  mann die Items so eingefügt hat.

    ListBox1.Items.AddRange(TextBox2.Text.Split(" "c))

    Hier mal der Code mit dem ich es probiert habe.

            Try
                If ListBox1.Items.Contains(TextBox2.Text) = True Then
                    MsgBox("Der von ihnen gewählte Spieler " & TextBox2.Text & " ist breits OP", MsgBoxStyle.Information, TextBox2.Text & " ist breits OP")
    
                Else
                    If TextBox2.Text = "" Then
                        MsgBox("Mann kann nicht jemandem Rechte geben der nichts ist", MsgBoxStyle.Exclamation, "Keinen Spieler endeckt")
                    Else
                        If TextBox2.Text.Contains(" ") Then
    
                 
                            ListBox1.Items.AddRange(TextBox2.Text.Split(" "c))
    
    
                            TextBox2.Clear()
    
                            If ListBox1.Items.Contains(" ") Then
    
                                ListBox1.Items.Remove(" ")
    
    
                            End If
    
                        Else
    
                            ListBox1.Items.Add(TextBox2.Text)
                        End If
    
                    End If
    
    
                End If
            Catch ex As Exception
                MsgBox(Err.Description)
            End Try

    Freitag, 27. September 2013 13:34

Antworten

  • Hallo,
    meine Lösung, von deiner letzten frage, mittels AddRange wird hier für dich vielleicht etwas schwierig. Darum zeige ich dir 2 Wege auf:

    1. 1. Alle Elemente durchgehen und abfragen und ggf. einfügen:
              ListBox1.Items.Clear() 'Items löschen
              Dim items As String() = TextBox1.Text.Split(" "c) 'Auf splitten
              For Each item In items
                  'Alle Elemente durchgehen
                  If Not String.IsNullOrWhiteSpace(item) Then
                      'Nicht null, "" oder aus Leerzeichen bestehend
                      'Funktioniert ab .NET 4., in früheren Frameworks müsste man die Leerzeichen manuell abprüfen Beispielsweise so:
                      'If Not String.IsNullOrEmpty(item) And item.Replace(" ", "").Length <> 0 Then
                      If Not ListBox1.Items.Contains(item) Then
                          'Item noch nicht enthalten
                          ListBox1.Items.Add(item) 'Hinzufügen
                      End If
                  End If
              Next
    2. Über LINQ. Diese Lösung ist deutlich kürzer, arbeitet in der Regel "schneller", ist aber vielleicht anfangs schwer zu begreifen.
              ListBox1.Items.Clear() 'Items löschen
              ListBox1.Items.AddRange(TextBox1.Text.Split(" "c).Where(Function(x) Not String.IsNullOrWhiteSpace(x)).Distinct().ToArray())
      Where filtert nur Elemente heraus, die nicht null etc. sind. Beachte Das die IsNullOrWhiteSpace-Methode erst ab .NET 4.0 verfügbar ist. Für frühere Versionen siehe in die Kommentare des ersten Codes.
      Distinct filtert danach von Mehrfach vorkommenden Elementen das erste heraus. ToArray macht nun wieder ein Array daraus, damit AddRange es verarbeiten kann.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:00
    • Tag als Antwort aufgehoben Tobpy Freitag, 27. September 2013 14:00
    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:09
    Freitag, 27. September 2013 13:54
    Moderator
    1. "Normal"-Version
      Hier muss man die Contains-Abfrage ändern.
      Nun müssen dafür wieder alle Elemente durch gegangen und abgeprüft werden.
              For Each item In items
                  'Alle Elemente durchgehen
                  If Not String.IsNullOrWhiteSpace(item) Then
                      'Nicht null, "" oder aus Leerzeichen bestehend
                      'Funktioniert ab .NET 4., in früheren Frameworks müsste man die Leerzeichen manuell abprüfen Beispielsweise so:
                      'If Not String.IsNullOrEmpty(item) And item.Replace(" ", "").Length <> 0 Then
                      If Not ListBox1.Items.Contains(item) Then
                          Dim add As Boolean = True
                          For Each addedItem As String In ListBox1.Items
                              If addedItem.Equals(item, StringComparison.CurrentCultureIgnoreCase) Then 'Item gefunden
                                  add = False 'Nicht hinzufügen
                                  Exit For 'Schleife verlassen
                              End If
                          Next
                          If add Then
                              'Item noch nicht enthalten
                              ListBox1.Items.Add(item) 'Hinzufügen
                          End If
                      End If
                  End If
              Next
    2. LINQ-Version
      Hier wirds nun echt schwierig. Distinct hat eine Überladung, welche die Items über einen EqualityComparer vergleicht. Dazu kann man diese Klasse nutzen.
      Mithilfe der übersetzten VB-Versions sähe es dann so aus:
      ListBox1.Items.AddRange(TextBox1.Text.Split(" "c).Where(Function(x) Not String.IsNullOrWhiteSpace(x)).Distinct(New LambdaEqualityComparer(Of String)(Function(x, y) x.Equals(y, StringComparison.CurrentCultureIgnoreCase), Function(x) 0)).ToArray())
      Das Fett markierte, ist die wichtige Änderung davon. Der eigentliche Abgleich, ist der selbe, wie bei der "normalen" Version.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:29
    Freitag, 27. September 2013 14:16
    Moderator

Alle Antworten

  • Hallo,
    meine Lösung, von deiner letzten frage, mittels AddRange wird hier für dich vielleicht etwas schwierig. Darum zeige ich dir 2 Wege auf:

    1. 1. Alle Elemente durchgehen und abfragen und ggf. einfügen:
              ListBox1.Items.Clear() 'Items löschen
              Dim items As String() = TextBox1.Text.Split(" "c) 'Auf splitten
              For Each item In items
                  'Alle Elemente durchgehen
                  If Not String.IsNullOrWhiteSpace(item) Then
                      'Nicht null, "" oder aus Leerzeichen bestehend
                      'Funktioniert ab .NET 4., in früheren Frameworks müsste man die Leerzeichen manuell abprüfen Beispielsweise so:
                      'If Not String.IsNullOrEmpty(item) And item.Replace(" ", "").Length <> 0 Then
                      If Not ListBox1.Items.Contains(item) Then
                          'Item noch nicht enthalten
                          ListBox1.Items.Add(item) 'Hinzufügen
                      End If
                  End If
              Next
    2. Über LINQ. Diese Lösung ist deutlich kürzer, arbeitet in der Regel "schneller", ist aber vielleicht anfangs schwer zu begreifen.
              ListBox1.Items.Clear() 'Items löschen
              ListBox1.Items.AddRange(TextBox1.Text.Split(" "c).Where(Function(x) Not String.IsNullOrWhiteSpace(x)).Distinct().ToArray())
      Where filtert nur Elemente heraus, die nicht null etc. sind. Beachte Das die IsNullOrWhiteSpace-Methode erst ab .NET 4.0 verfügbar ist. Für frühere Versionen siehe in die Kommentare des ersten Codes.
      Distinct filtert danach von Mehrfach vorkommenden Elementen das erste heraus. ToArray macht nun wieder ein Array daraus, damit AddRange es verarbeiten kann.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:00
    • Tag als Antwort aufgehoben Tobpy Freitag, 27. September 2013 14:00
    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:09
    Freitag, 27. September 2013 13:54
    Moderator
  • Funktioniert alles soweit. Danke :)

    Allerdings hätte ich da noch eine kleine Frage.

    Ist es möglich, dass auch doppelte Wörter gefunden werden und nicht hinzugefügt werden, wenn einfach nur die Groß und Kleinschreibung anders ist. Also bei mir kann ich z.B. das Wort Not einfügen und dann aber auch nochmal das Wort not nur in klein. Ist es möglich dies zu verhindern??

    Freitag, 27. September 2013 14:02
    1. "Normal"-Version
      Hier muss man die Contains-Abfrage ändern.
      Nun müssen dafür wieder alle Elemente durch gegangen und abgeprüft werden.
              For Each item In items
                  'Alle Elemente durchgehen
                  If Not String.IsNullOrWhiteSpace(item) Then
                      'Nicht null, "" oder aus Leerzeichen bestehend
                      'Funktioniert ab .NET 4., in früheren Frameworks müsste man die Leerzeichen manuell abprüfen Beispielsweise so:
                      'If Not String.IsNullOrEmpty(item) And item.Replace(" ", "").Length <> 0 Then
                      If Not ListBox1.Items.Contains(item) Then
                          Dim add As Boolean = True
                          For Each addedItem As String In ListBox1.Items
                              If addedItem.Equals(item, StringComparison.CurrentCultureIgnoreCase) Then 'Item gefunden
                                  add = False 'Nicht hinzufügen
                                  Exit For 'Schleife verlassen
                              End If
                          Next
                          If add Then
                              'Item noch nicht enthalten
                              ListBox1.Items.Add(item) 'Hinzufügen
                          End If
                      End If
                  End If
              Next
    2. LINQ-Version
      Hier wirds nun echt schwierig. Distinct hat eine Überladung, welche die Items über einen EqualityComparer vergleicht. Dazu kann man diese Klasse nutzen.
      Mithilfe der übersetzten VB-Versions sähe es dann so aus:
      ListBox1.Items.AddRange(TextBox1.Text.Split(" "c).Where(Function(x) Not String.IsNullOrWhiteSpace(x)).Distinct(New LambdaEqualityComparer(Of String)(Function(x, y) x.Equals(y, StringComparison.CurrentCultureIgnoreCase), Function(x) 0)).ToArray())
      Das Fett markierte, ist die wichtige Änderung davon. Der eigentliche Abgleich, ist der selbe, wie bei der "normalen" Version.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Freitag, 27. September 2013 14:29
    Freitag, 27. September 2013 14:16
    Moderator