| |
VB.NET - Ein- und UmsteigerListbox 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. | |
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. | |
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 | |
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. | |
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) | |
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 | |
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. | |
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 | |
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. | |
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 | |
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) | |
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. | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|
|
|
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
|
|