Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0008: CompareOperator

 von 

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:

Schwierigkeitsgrad 2

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:

Download des Beispielprojektes [2,57 KB]

' 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.