2016-11-01 8 views
1

Ich habe diese Struktur:Sortieren eine Datenbank-Struktur in Visual Basic

Module Global_Variables 
    Public myrecords(10) As myDatabase 
    Public counter As Integer = 0 

    Public Structure myDatabase 
     'creates database Structure For input data 
     <VBFixedString(30)> _ 
     Dim Driver As String   '30 bytes 
     Dim Car As Integer    '4 bytes 
     <VBFixedString(15)> _ 
     Dim Team As String    '15 bytes 
     Dim Grid As Integer   '4 bytes 
     Dim FastestLap As Double  '8 bytes 
     Dim RaceTime As Double   '4 bytes 
     Dim Points As Double   '4 bytes 

    End Structure 
End Module 

Das Programm empfängt Daten von dem Benutzer und zeigt dann die Daten in einem Textfeld txtOutput in einer anderen Form genannt:

myrecords(counter).Driver = driver_box.Text 
myrecords(counter).Car = car_box.Text 
myrecords(counter).Team = team_box.Text 
myrecords(counter).Grid = grid_box.Text 
myrecords(counter).FastestLap = fl_box.Text 
myrecords(counter).RaceTime = rt_box.Text 
myrecords(counter).Points = points_box.Text 

Form_Display.txtDisplay.AppendText(myrecords(counter).Driver & "   " & 
    myrecords(counter).Car & "   " & myrecords(counter).Team & "   " & 
    myrecords(counter).Grid & "    " & myrecords(counter).FastestLap & "    " & 
    myrecords(counter).RaceTime & "   " & myrecords(counter).Points & vbCrLf) 

counter = counter + 1 
MsgBox("Submit success!") 
Call input_box_clear() 

Der Benutzer kann dann auf eine Schaltfläche klicken, um die Datensätze in aufsteigender Reihenfolge nach der schnellsten Runde zu sortieren. Wie mache ich das?

Ich habe versucht, Algorithmen wie Blase Sortierung und Auswahl sortieren, aber keiner funktionierte.

Danke

+0

REGEL # 1 hinzufügen : Deklarieren Sie keine Strukturtypen, die größer als 16 Byte sind. Alles> 16 - deklariere eine Klasse. –

+0

Verwenden Sie LINQ und Sie werden nie Ihren eigenen Algorithmus schreiben müssen –

+0

Schauen Sie sich auch 'String.Format()' als eine bessere Option an, um Ihre Display-Zeichenkette zu erstellen. –

Antwort

1

Deklarieren Typ (Klasse, nicht Struktur)

Public class RaceData 
    Public Property Driver As String 
    Public Property Car As Integer 
    Public Property Team As String 
    Public Property Grid As Integer 
    Public Property FastestLap As Double 
    Public Property RaceTime As Double 
    Public Property Points As Double 
End Class 

In-Memory-Datenbank (schauen, was in System.Collections ist)

Private _raceDb As New List(Of RaceData)() 

hinzufügen Benutzereingabe

Dim newItem As New RaceData() 
newItem.Driver = driver_box.Text 
newItem.Car = Integer.Parse(car_box.Text) 
newItem.Team = team_box.Text 
newItem.Grid = Integer.Parse(grid_box.Text) 
newItem.FastestLap = Double.Parse(fl_box.Text) 
newItem.RaceTime = Double.Parse(rt_box.Text) 
newItem.Points = Double.Parse(points_box.Text) 
_raceDb.Add(newItem) 

Sortierung für das Gitter (Lesen Sie mehr über LINQ)

// sort by fastest race time 
Dim sortedDb As List(Of RaceData) = _raceDb.OrderBy(Function(x) x.RaceTime).ToList() 

Wählen Sie eine schnellste Renn

Dim fastest As RaceData = _raceDb.OrderBy(Function(x) x.RaceTime).FirstOrDefault() 
If fastest IsNot Nothing Then ... 

einen String bauen für jedes Element zu mehrzeiligen Textbox

Dim lines() As String = _raceDb.Select(Function(x) x.Driver & " --- " & x.Team).ToArray() 
' Using some tips from the comments 
Dim lines() As String = _raceDb. 
    Select(Function(x) string.Format("{0,-30} --- {1,15}", x.Driver, x.Team)).ToArray()