Witam.
Mam linijki w TextBoxie coś jak:
Maniek - 10 GB
Borys 5,5 GB
Ola - 2 GB
Arek - 60,8 GB
Maniek77 - 11,2 GB
I chciałbym te linijki posortować ale nie alfabetycznie tylko wg. tej ilości "GB".
Mógłby ktoś mnie nakierować jak to zrobić ?
Witam.
Mam linijki w TextBoxie coś jak:
Maniek - 10 GB
Borys 5,5 GB
Ola - 2 GB
Arek - 60,8 GB
Maniek77 - 11,2 GB
I chciałbym te linijki posortować ale nie alfabetycznie tylko wg. tej ilości "GB".
Mógłby ktoś mnie nakierować jak to zrobić ?
Trzeba by pewnie pobrać linie, wyciągnąć wyrażeniem regularnym te liczby, posortować, nadpisać.
Prościej gdybyś użył innej kontrolki, np listview, listbox, datagridview.
@kosmita90he - komponenty nie służą do przechowywania danych, a do ich wyświetlania; Więc te dane trzymaj gdzieś indziej, a w komponencie je tylko wyświetlaj; Dzięki temu nie będziesz musiał tych linijek parsować, a w prosty sposób odczytać i jedną informację (nazwę użytkownika, czy co to jest) i drugą (ilość GB
);
A jak już koniecznie upierasz się, aby z komponentu zrobić kontener, to sprawdzaj znaki w linijce i jeśli natrafisz na pierwszy biały znak - wypakuj podciąg aż do litery G
, na koniec trim i gotowe; Ewentualnie najpierw wywal wszystkie białe znaki, jeśli znak -
przed liczbą to minus.
@kosmita90he pokazywałem Ci kiedyś (dość dawno chyba przy linkach do hostingów) jak używać własnej funkcji sortowania ucz się bo wiecznie żył nie będę (chyba że zaczniesz płacić za pomoc):
Option Explicit On
Imports System.Text.RegularExpressions
Public Class Form1
Function GetValueFromLine(Line As String) As Double
Dim value As Double = 0
'to wyrażenie nie wiem czy jest dobrze o nie wiem dokładnie czy nazwy userów mogą mieć spacje na przykład byłoby źle w przypadku usera "magda 77"
Dim regex As Regex = New Regex(" ([0-9,]+)")
'Dim regex As Regex = New Regex("- ([0-9,]+)") 'jeżeli zawsze przed wartością jest myślnik i spacja to lepiej tak
Dim match As Match = regex.Match(Line)
If match.Success Then
Double.TryParse(match.Groups(1).Value, value)
End If
Return value
End Function
Private Sub btnSort_Click(sender As Object, e As EventArgs) Handles btnSort.Click
Dim userList = New List(Of String)
userList.AddRange(TextBox1.Lines)
TextBox1.Clear()
userList.Sort(Function(userX As String, userY As String)
Dim valX, valY As Double
valX = GetValueFromLine(userX)
valY = GetValueFromLine(userY)
Return -valX.CompareTo(valY) 'usun minus aby zmienic kierunek sortowania
End Function)
For Each line As String In userList
TextBox1.AppendText(line & Environment.NewLine)
Next
End Sub
End Class