Für typsicheren Code stehen in System.Collections.Generic geeignete
Listen-Klassen zur Verfügung.
Um eine Klasse nach verschiedenen Kriterien vergleichen und
sortieren zu können, ist ein separater Comparer zweckmäßig.
Falls möglich, sollten Sortier-Vergleiche ein eindeutiges Ergebnis
liefern (z.b. hierarchisch)
Public Class Person
'Properties mit Defaultwerten z.B. um Nothing zu vermeiden
Public Property Name As String = ""
Public Property Vorname As String = ""
Public Property GebDat As Date = DateTime.MinValue
Public Sub New()
'parameterfreier Konstruktor für Default-Instanz
End Sub
Public Sub New(ByVal name As String, ByVal vorname As String, ByVal _
gebdat As Date)
Me.Name = name
Me.Vorname = vorname
Me.GebDat = gebdat
End Sub
End Class
'Sortierkriterien-Aufzählung
Public Enum PersonCompareEnum As Integer
Name
Vorname
Geburtsdatum
End Enum
'Parametrisierter Comparer zum (hierarchischen) Vergleichen und Sortieren
' von Personen
Public Class PersonComparer
Implements IComparer(Of Person)
Public Property CompareProperty As PersonCompareEnum = _
PersonCompareEnum.Name
Public Property CompareOrder As Windows.Forms.SortOrder
Public Function Compare(x As Person, y As Person) As Integer
Implements IComparer(Of Person).Compare
Dim c_name, c_vorname, c_geb, c As Integer
'Klassen-Properties einzeln vergleichen
c_name = x.Name.CompareTo(y.Name)
c_vorname = x.Vorname.CompareTo(y.Vorname)
c_geb = x.GebDat.CompareTo(y.GebDat)
'Hierarchischer Vergleich nach CompareProperty
Select Case CompareProperty
Case PersonCompareEnum.Name
c = getSortOrder(c_name, c_vorname, c_geb)
Case PersonCompareEnum.Vorname
c = getSortOrder(c_vorname, c_name, c_geb)
Case PersonCompareEnum.Geburtsdatum
c = getSortOrder(c_geb, c_name, c_vorname)
Case Else
Throw New NotImplementedException()
End Select
'Vergleichsrichtung einbeziehen
If CompareOrder = SortOrder.Descending Then
c *= -1
End If
'Vergleichsergebnis
Return c
End Function
Private Function getSortOrder(a As Integer, b As Integer, c As Integer) _
As Integer
'Aus Einzelvergleichen den Gesamtvergleich erstellen
Dim r As Integer = a
If r = 0 Then r = b
If r = 0 Then r = c
Return r
End Function
End Class
'Beispiel:
'Eine Zugriffsvariable auf eine Liste von Personen
Dim Personen As List(Of Person)
Private Sub Demo()
'Eine Liste erstellen und füllen (Nutzung der Defaultinstanz bei NEW)
Personen = New List(Of Person)
Personen.Add(New Person With
{.Name = "Müller", .Vorname = "Hans",
.GebDat = New DateTime(2010, 5, 18)})
Personen.Add(New Person With
{.Name = "Schulze", .Vorname = "Gert",
.GebDat = New DateTime(1995, 12, 24)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 2)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 4)})
'Die Liste fallend sortieren nach Vorname (incl. Name/Geburt)
Personen.Sort(New PersonComparer With
{.CompareProperty = PersonCompareEnum.Vorname,
.CompareOrder = SortOrder.Descending})
For i As Integer = 0 To Personen.Count - 1
With Personen(i)
System.Diagnostics.Debug.WriteLine
(.Name & " " & .Vorname & " " & .GebDat.ToString)
End With
Next i
End Sub |