Forum: PC-Programmierung VB.NET String sortieren


von Tobi S. (schmidlitsky)


Lesenswert?

Hallo zusammen,

vorab: Ich bin noch neu in der VB.NET Programmierung und bitte den ein 
oder anderen Fehler und eventuell gewöhnungsbedürftigen Programmierstil 
zu entschuldigen.

Es geht um folgendes:
Ich habe eine "List of String()" und möchte diese sortieren.
In der erste "Spalte" stehen Bezeichnungen wie zum Beispiel abc_1 bis 
abc_107 ("abc" ist dabei konstant) und in der zweiten Spalte die 
dazugehörigen Werte. Das Ganze wird aus einer .txt Datei heraus geladen 
und die Bezeichnung und der Wert werden mit einem ";" voneinander 
getrennt.

Problem dabei ist, dass bei der Ausgabe die Reihenfolge genauso wie in 
der .txt Datei nicht numerisch sortiert ist, d.h.
abc_1
abc_10
abc_100
usw.

Dass macht zwar Sinn, ist aber für meine Zwecke ungeeignet.
Ich bräuchte es nämlich so:
abc_1
abc_2
abc_3
...
abc_107

Wichtig ist auch, dass die dazugehörigen Werte aus der zweiten Spalte 
mit sortiert werden, damit die Zuordnung nachdem sortieren noch gegeben 
ist. Es sollten also nur die Zeilen sortiert werden.

Ich freue mich über jeden Lösungsansatz, weil ich irgendwie gerade 
ziemlich auf der Leitung stehe.

Code:
1
    Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
2
        Dim datei As FileStream    
3
        Dim lesen As StreamReader
4
        Dim zeile As String
5
        Dim spalte As String()
6
        Dim temp As New List(Of String())
7
8
9
        'Überprüfe, ob die Datei existiert
10
        If Not File.Exists("H:\Test.TXT") Then
11
            MessageBox.Show("Fehler: " & vbCrLf & "Datei nicht vorhanden!")
12
            Exit Sub
13
        End If
14
15
        datei = New FileStream("H:\Test.TXT", FileMode.Open)
16
        lesen = New StreamReader(datei)
17
18
19
20
        Do Until lesen.Peek() = -1
21
22
            zeile = lesen.ReadLine()
23
24
            If zeile.StartsWith("abc_")  Then
25
                spalte = zeile.Split(";")
26
            Else
27
                Continue Do
28
            End If
29
30
            temp.Add(spalte)
31
32
        Loop
33
34
        'Ausgabe
35
        For i As Integer = 0 To temp.Count - 1
36
            For j As Integer = 0 To 1
37
                TextBox1.Text &= temp(i)(j) & vbCrLf
38
            Next
39
            TextBox1.Text &= vbCrLf
40
        Next
41
        lesen.Close()
42
43
    End Sub

Danke schon mal.
Grüße

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Tobi S. schrieb:
> Ich freue mich über jeden Lösungsansatz, weil ich irgendwie gerade
> ziemlich auf der Leitung stehe.

kann leider kein VB.net sondern nur c#

Ich würde eine stuktur anlegen, wo jede Zeile gespeichert wird

struct RowS {
  string Name;
  int Wert;
}

dann eine Liste von der stuktur anlegen

List<RowS> list;

dann einlesen

while(...) {
   RowS  r;
   r.Name = ...
   r.Wert = ...
   list.add( r );
}

jetzt einfach sortieren lasen

list.Sort( SortMethode );


und ausgeben

...

Dann noch die Funktion SortMethode

int SortMethode( RowS r1, RowS r2 )
{
   int i1 = int.parse( r1.wert.Substring(4) );
   int i2 = int.parse( r2.wert.Substring(4) );

   if ( i1 = i2 ) {
       return i1.Compare(i2);
   } else {
       return r1.Wert.Compare(r2.Wert);
   }
}


So in der Art, aber es sind bestimmt noch viele Fehler drin, habe nichts 
geprüft.

Wenn du es mit C# machen könntest, könnte ich bei fehlern weiterhelfen.

von Tobi S. (schmidlitsky)


Lesenswert?

Danke für den Ansatz Peter!
Werde es mal versuchen in VB.NET umzusetzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.