VB.NET-Tipp 0008: CompareOperator
von Herfried Wagner
Beschreibung
Beispiel zur Implementierung eines Vergleichsoperators, der beim Sortieren einer ArrayList benutzt wird. Auf diese Weise konnen auch Sammlungen von Elementen eines benutzerdefinierten Datentyps sortiert werden. In diesem Beispiel modelliert die Klasse CElement ein Objekt mit Namen Name, das einen Wert Cost und ein Gewicht Weight besitzt. Der Nutzen (value) des Objekts errechnet sich aus dem Quotienten aus Wert und Gewicht. Aus bestimmten Gründen wollen wir aber den Nutzen nicht in der Klasse speichern, jedoch nach diesem sortieren können.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' ' ############################################################################## ' ################################ Element.vb ################################## ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary ' <remarks> ' Stellt ein Element dar. ' </remarks> Public Class Element Private m_intWeight As Integer Private m_intCost As Integer Private m_strName As String ' <summary> ' Erstellt eine neue Instanz der Klasse und ' weist den Eigenschaften die in den ' Parametern übergebenen Werte zu. ' </summary> ' <param name="intWeight">Anfangswert der Eigenschaft ' <c>Weight</c>.</param> ' <param name="intCost">Anfangswert der Eigenschaft ' <c>Cost</c>.</param> ' <param name="strName">Anfangswert der Eigenschaft ' <c>Name</c>.</param> Public Sub New( _ ByVal intWeight As Integer, _ ByVal intCost As Integer, _ ByVal strName As String) m_intWeight = intWeight m_intCost = intCost m_strName = strName End Sub ' <summary> ' Gibt das Gewicht des Objekts an oder gibt es zurück. ' </summary> ' <value>Gewicht des Objekts.</value> Public Property Weight() As Integer Get Return m_intWeight End Get Set(ByVal Value As Integer) m_intWeight = Value End Set End Property ' <summary> ' Gibt den Wert des Objekts an oder gibt ihn zurück. ' </summary> ' <value>Wert des Objekts.</value> Public Property Cost() As Integer Get Return m_intCost End Get Set(ByVal Value As Integer) m_intCost = Value End Set End Property ' <summary> ' Gibt den Namen des Objekts an oder gibt ihn zurück. ' </summary> ' <value>Name des Objekts.</value> Public Property Name() As String Get Return m_strName End Get Set(ByVal Value As String) m_strName = Value End Set End Property End Class ' ############################################################################## ' ################################## Main.vb ################################### ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Collections ' <remarks> ' Stellt den Einsprungspunkt der Anwendung bereit. ' </remarks> Public Class Main ' <summary> ' Der Einsprungspunkt der Anwendung. ' </summary> Public Shared Sub Main() ' Neue Liste erstellen. Dim alst As ArrayList = New ArrayList() ' Beispieldaten einfügen. alst.Add(New Element(10, 100, "Hundekuchen")) alst.Add(New Element(100, 100, "Beissknochen")) alst.Add(New Element(20, 1000, "Knabberstab")) ' Liste mit benutzerdefiniertem Vergleicher sortieren. alst.Sort(New ValueComparer()) ' Sortierte Liste durchlaufen und Elemente ausgeben. Dim i As Integer For i = 0 To alst.Count - 1 Dim el As Element = DirectCast(alst(i), Element) Console.WriteLine("Name: {0}, Nutzen: {1}", _ el.Name, el.Cost / el.Weight) Next i ' Liste leeren. alst.Clear() End Sub End Class ' ############################################################################## ' ############################# ValueComparer.vb ############################### ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System.Collections ' <remarks> ' Implementiert einen Vergleicher. ' </remarks> Public Class ValueComparer Implements IComparer ' <summary> ' Führt einen Vergleich der Objekte in den Parametern ' <paramref name="x"/> und <paramref name="y"/>. ' </summary> ' <param name="x">Das erste der beiden zu vergleichenden Objekte.</param> ' <param name="y">Das zweite der beiden zu vergleichenden Objekte.</param> ' <returns> ' < 0 x ist kleiner als y. ' = 0 x ist gleich y. ' > 0 x ist grösser als y. ' </returns> Public Function Compare( _ ByVal x As Object, _ ByVal y As Object) _ As Integer Implements IComparer.Compare Dim el1 As Element = DirectCast(x, Element) Dim el2 As Element = DirectCast(y, Element) Return CInt((el1.Cost / el1.Weight) - (el2.Cost / el2.Weight)) End Function End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.