Forum: VB.NET |
Thema:
AW: Sortieren und Filtern einer Collection |
Von:
Bernhard Grojer (
29.06.2006 23:45) |
Ich bin mal einen Schritt weiter:
Namespace CustomList
Public Class ListBase(Of T)
Inherits System.Collections.Generic.List(Of T)
Public Sub Filter(ByVal strField As String, ByVal FilterOperators As FilterOperators, ByVal strValue As String)
For i As Integer = MyBase.Count - 1 To 0 Step -1
Select Case FilterOperators
Case FilterOperators.Smaller
If Not MyBase.Item(i).GetType.GetProperty(strField).GetValue(MyBase.Item(i), Nothing) < strValue Then
MyBase.Remove(MyBase.Item(i))
End If
Case FilterOperators.Bigger
If Not MyBase.Item(i).GetType.GetProperty(strField).GetValue(MyBase.Item(i), Nothing) > strValue Then
MyBase.Remove(MyBase.Item(i))
End If
Case FilterOperators.Like
If String.Compare(MyBase.Item(i).GetType.GetProperty(strField).GetValue(MyBase.Item(i), Nothing).ToString, strValue.ToString, True) = 0 Then
MyBase.Remove(MyBase.Item(i))
End If
Case FilterOperators.Equal
If String.Compare(MyBase.Item(i).GetType.GetProperty(strField).GetValue(MyBase.Item(i), Nothing).ToString, strValue.ToString) = 0 Then
MyBase.Remove(MyBase.Item(i))
End If
Case FilterOperators.NotEqual
If String.Compare(MyBase.Item(i).GetType.GetProperty(strField).GetValue(MyBase.Item(i), Nothing).ToString, strValue.ToString) <> 0 Then
MyBase.Remove(MyBase.Item(i))
End If
Case Else
Throw New Exception("Filteroperator not implemented!")
End Select
Next
End Sub
Public Overloads Sub Sort(ByVal strSortField As String)
MyBase.Sort(New CustomComparer(Of T)(strSortField))
End Sub
End Class
Enum FilterOperators
Smaller
Bigger
[Like]
Equal
NotEqual
End Enum
Public Class CustomComparer(Of T)
Inherits Comparer(Of T)
Private _sortField As String
Public Sub New(ByVal sortField As String)
_sortField = sortField
End Sub
Public Overrides Function Compare(ByVal x As T, ByVal y As T) As Integer
Dim ObjectX As Object = x.GetType().GetProperty(Me._sortField).GetValue(x, Nothing)
Dim ObjectY As Object = y.GetType().GetProperty(Me._sortField).GetValue(y, Nothing)
Return String.Compare(ObjectX, ObjectY)
End Function
End Class
Public MustInherit Class ItemBase
End Class
End Namespace
Anwendung:
Dim TestList As New ListBase(Of TestItem)
For i As Integer = 0 To 10
TestList.Add(New TestItem("Test1"))
TestList.Add(New TestItem("Test2"))
TestList.Add(New TestItem("Test4"))
TestList.Add(New TestItem("Test3"))
TestList.Add(New TestItem("Test5"))
Next
Console.WriteLine("Filter Start: " & Now & ":" & Now.Millisecond)
TestList.Filter("Name", FilterOperators.Like, "Test4")
Console.WriteLine("Filter Stop: " & Now & ":" & Now.Millisecond)
Console.WriteLine("Sort Start: " & Now & ":" & Now.Millisecond)
TestList.Sort("Name")
Console.WriteLine("Sort Stop: " & Now & ":" & Now.Millisecond)
For Each myTestItem As TestItem In TestList
Console.WriteLine(myTestItem.Name)
Next
Public Class TestItem
Inherits ItemBase
Private _name As String
Property Name() As String
Get
Return Me._name
End Get
Set(ByVal value As String)
Me._name = value
End Set
End Property
Public Sub New(ByVal Name As String)
_name = Name
End Sub
End Class
Jetzt gehts ans Tuning (und implementieren von Datumssortierung, Filterung, usw. usf.
Vorschläge Ideen?
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!