vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Listbox doppelte Einträge zählen und sortieren 
Autor: firemike
Datum: 16.03.14 14:56

Hallo,
ich habe eine Listbox die mehrere doppelte Einträge enthält.
Das ist auch so gewünscht. Nun möchte ich aber diese Einträge nach Ihrer Häufigkeit
sortiert in der Listbox stehen haben und zwar so:

(8) Äpfel
(6) Birnen
(5) Gurken
usw.

Dabei sollen natürlich die doppelten Einträge verschwinden und so wie oben beschrieben dargestellt werden.

Hat jemand nen Tipp für mich wie ich das hinbekomme?

Danke im voraus
Mike

Beitrag wurde zuletzt am 16.03.14 um 14:58:33 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 16.03.14 15:33

Hallo!

Wie verwendest Du die Listbox?

Sie sollte an eine Datenquelle gebunden sein.
(Ich würde diese Quelle durchlaufen und die Einträge als
Schlüsselwerte für eine mit-zählende Dictionary nutzen.)

Sei lbo die Listbox:
[
   'Liste mit Angaben
   Dim frucht As New Collections.Generic.List(Of String)
 
   For i As Integer = 0 To 9
       frucht.Add("Gurken")
       frucht.Add("Gurken")
       frucht.Add("Gurken")
       frucht.Add("Birnen")
       frucht.Add("Birnen")
       frucht.Add("Äpfel")
   Next i
 
   'Aufbereitung der Liste als sortierte Dictionary
   Dim dic As New Collections.Generic.SortedDictionary(Of String, Integer)
   For i As Integer = 0 To frucht.Count - 1
       If dic.ContainsKey(frucht(i)) Then
          dic(frucht(i)) += 1
       Else
          dic.Add(frucht(i), 1)
       End If
   Next i
 
   'Aufbereitung der Häufigkeiten als Liste
   Dim fruchtfreq As New Collections.Generic.List(Of String)
   For Each key As String In dic.Keys
       fruchtfreq.Add("(" & CStr(dic(key)) & ") " & key)
   Next key
 
   'Datenquelle der Listbox belegen
   lbo.DataSource = fruchtfreq


Beitrag wurde zuletzt am 16.03.14 um 15:47:30 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: firemike
Datum: 16.03.14 16:08

Hallo,
danke für deine Antwort, meine Daten kommen aus einer Textbox (Multi Line).

Gruss Mike
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 16.03.14 16:09

Ach so. Die Häufigkeits-Liste soll fallend sortiert sein, nach Häufigkeit.
'zusätzlich
fruchtfreq.Sort(AddressOf CompareStringDescending)
'Der benötigte Comparer:
    Private Function CompareStringDescending _
       (ByVal a As String, b As String) As Integer
 
        If a > b Then Return -1
        If a < b Then Return 1
        Return 0
    End Function


Beitrag wurde zuletzt am 16.03.14 um 16:09:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 16.03.14 16:15


Ein Control ist keine geeignete Datenquelle.
Übertrage Deine Textbox-Zeilen am besten zunächst in eine Liste.

Sei "tbo" eine Multiline-Textbox ...
Dim frucht As New Collections.Generic.List(Of String)
frucht.AddRange(tbo.Lines)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: firemike
Datum: 16.03.14 16:40

Hallo,
ganz funzt es noch nicht. In meiner MultiLine Textbox steht z.B.:
birne
birne
tomate
birne
apfel
tomate
birne
apfel
apfel
toast

Die Ausgabe in der Listbox ist dann:
(8)
(4) birne
(3) apfel
(2) tomate
(1) toast

Frage, woher kommt (8)?

Gruss Mike
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 16.03.14 16:49

Ich kann nur raten: Leerzeilen in der Textbox ???

'zusätzlich einen Filter setzen
 
Dim dic As New Collections.Generic.SortedDictionary(Of String, Integer)
For i As Integer = 0 To frucht.Count - 1
    If Not frucht(i) = String.Empty Then
        If dic.ContainsKey(frucht(i)) Then
           dic(frucht(i)) += 1
        Else
           dic.Add(frucht(i), 1)
        End If
    End If
Next i


Beitrag wurde zuletzt am 16.03.14 um 16:53:21 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: firemike
Datum: 16.03.14 16:54

hmm..

danke nochmal für deine hilfe, so komme ich auf jedenfall weiter

mike
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: ErfinderDesRades
Datum: 17.03.14 22:05

Zum Gruppieren eignet Linq sich ganz fabelhaft:
      Dim obsts = "birne birne tomate birne apfel tomate birne apfel apfel" & _
        "toast".Split
      Dim groupedObst = (From obst In obsts Group By obst Into Count()
                         Order By Count, obst Select String.Format("({0}) {1}", _
                           Count, obst)).ToList

(Rechtschreibfehler urheberrechtlich geschützt)

Beitrag wurde zuletzt am 17.03.14 um 22:07:49 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 18.03.14 11:40

Hallo!

Die gelisteten Einträge kommen offenbar aus einer Textbox, die auch
Empty- und Whitespace-Lines enthält.
In der Linq-Abfrage wird deshalb noch eine Where-Klausel benötigt:
     'Zeilen aus der Listbox 
Dim lines() As String = _
    ("birne birne tomate birne apfel tomate birne apfel apfel toast " & _
     vbCrLf & "      " & vbCrLf & _
     "birne birne tomate birne apfel tomate birne apfel apfel toast " & _
     vbCrLf & vbCrLf & _
     "birne birne tomate birne apfel tomate birne apfel apfel toast ").Split
 
 
Dim FilteredAndGroupedEntries As List(Of String) = _
     (From entry As String In lines _
      Where Not String.IsNullOrWhiteSpace(entry) _
      Group By entry Into Count() _
      Order By Count, entry _
      Select String.Format("({0}) {1}", NumberFormat(Count, 3), entry)).ToList
Beispiel für eine Formatierungs-Routine für Zahlen:
Private Function NumberFormat(ByVal number As Integer, _
        byval leng As Integer) As String
 
        Dim ret As String = CStr(number)
        Dim adds As Integer = leng - ret.Length
        If adds > 0 Then ret = StrDup(adds, " "c) & ret
        Return ret
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: ErfinderDesRades
Datum: 18.03.14 12:00

sowas ähnliches wie deine Numberformat-Funktion ist in String.Format bereits eingebaut
      Dim lines() As String = _
    ("birne birne tomate birne apfel tomate birne apfel apfel toast " & _
     vbCrLf & "      " & vbCrLf & _
     "birne birne tomate birne apfel tomate birne apfel apfel toast " & _
     vbCrLf & vbCrLf & _
     "birne birne tomate birne apfel tomate birne apfel apfel toast ").Split
 
 
      Dim FilteredAndGroupedEntries As List(Of String) = _
           (From entry As String In lines _
            Where Not String.IsNullOrWhiteSpace(entry) _
            Group By entry Into Count() _
            Order By Count, entry _
            Select String.Format("({0,3}) {1}", Count, entry)).ToList

(Rechtschreibfehler urheberrechtlich geschützt)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listbox doppelte Einträge zählen und sortieren 
Autor: Manfred X
Datum: 18.03.14 13:11

Du hast recht - das war kein gutes Beispiel für die Verwendung
einer Function innerhalb einer LINQ-Abfrage.

2. Versuch:
Dim FilteredAndGroupedEntries As List(Of String) = _
    (From entry As String In lines _
     Where Not String.IsNullOrWhiteSpace(entry) _
     Let fentry As String = WordFormat(entry) _
     Group By fentry Into Count() _
     Order By Count, fentry _
     Select String.Format("({0,3}) {1}", Count, fentry)).ToList
Die Formatierungs-Routine:
Private Function WordFormat(ByVal word As String) As String
   If String.IsNullOrWhiteSpace(word) Then Return String.Empty
   word = Trim(word)
   Dim start As String = word.Substring(0, 1).ToUpper
   Dim rest As String = word.Substring(1).ToLower
   Return start & rest
End Function


Beitrag wurde zuletzt am 18.03.14 um 13:22:40 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel