BigBastis Blog

VB.NET: Werte verschiedener Typen in einem Array unterbringen

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

VB.NET: Werte verschiedener Typen in einem Array unterbringen

Posted on .

Heute tauchte mal wieder die Frage auf, wie man das anstellen kann verschiedene Werte z.B.: String und Double in einen einzigen Array zu stecken. Dabei sollte dies möglich einfach zu handhaben sein, wie ein mehrdimensionales Array, bei dem jede Dimension einen anderen Typen hat.

Das geht so natürlich nicht, da ein Array immer nur einen Typ haben kann und alle Elemente dessen haben dann auch diesen einen Typ. Doch dieses Problem lässt sich ganz einfach umgehen, in dem man den Array auf eine eigene Klasse typisiert.

Mit anderen Worten, man schafft sich eine eigene Klasse an, die zwei Properties zur Verfügung stellt die jeweils ein String und einen Double Wert annehmen. Wenn man nun ein einfaches eindimensionales Array von diesem Typ erstellt hat man genau die Problemstellung erfüllt, wie im ersten Absatz beschrieben.

Konkret sieht das so aus, wir erstellen uns eine eigene Klasse die unsere Werte halten soll:

Public Class Wert

    Private _doubleWert As Double = 0.0
    Private _stringWert As String = ""

    'Konstruktor
    Public Sub New(ByVal sWert As String, ByVal dWert As Double)
        _stringWert = sWert
        _doubleWert = dWert
    End Sub

    Public Property DoubleWert As Double
        Get
            Return _doubleWert
        End Get
        Set(ByVal value As Double)
            _doubleWert = value
        End Set
    End Property

    Public Property StringWert As String
        Get
            Return _stringWert
        End Get
        Set(ByVal value As String)
            _stringWert = value
        End Set
    End Property
End Class

Wenn man nun einen Array vom Typ dieser Klasse erstellt kann man ganz bequem auf dessen Properties zugreifen:

    Private Sub Form1_Load() Handles MyBase.Load
        'Nutzung

        Dim meinArray(5) As Wert

        meinArray(0) = New Wert("test", 1.5)
        meinArray(1) = New Wert("hallo", 3.6)

        'Ausgabe
        MessageBox.Show("Array auf Index 1: String: " & meinArray(1).StringWert _
                        & " - Double: " & meinArray(1).DoubleWert.ToString())
    End Sub

Wie man sieht ganz einfach .-)
Weitere Informationen zu Arrays:
http://openbook.galileocomputing.de/vb_net/msvb020017.htm#Rxxmsvb020017282MehrdimensionaleArrays
http://msdn.microsoft.com/de-de/library/wak0wfyt.aspx

Nachtrag:

Ich wurde von Thomas Baumann in den Kommentaren darauf hingewiesen, dass man das ganze auch mit einem Struct realisieren kann. Dies kann in vielen Fällen sogar auch performanter sein als mit Klassen, da Strukturen auf dem Stack abgelegt werden, und nicht wie Klassen auf dem Heap, was einen großen Geschwindigkeitsschub bedeutet.

Ich habe mich für die Version mit Klassen entschieden, da ich diese noch weiter verarbeite und hier nicht auf Klassen verzichten kann.

Ein Beispiel für eine Umsetzung  mit Strukturen findet ihr in dem Kommentar von Thomas.

Weitere Infos zu Unterschieden zwischen Klassen und Strukturen findet ihr hier.

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author Thomas Baumann

Posted at 11:54 6. Oktober 2010.

Nett 🙂
Aber eine Structure zu verwenden wäre deutlich performanter, als wie hier das mit Klassen zu lösen 😉

Da würde denn auch schon
Structure Werte
StringWert As String
DoubleWert As Double
‚ ggf
Sub New(StringWert As String, DoubleWert As Double)
Me.StringWert = StringWert
Me.DoubleWert = DoubleWert
End Sub
‚ end ggf 😉
End Structure
ausreichen, und der Wert muss nicht ewig hin und her kopiert werden (durch die Properties).

user

Author admin

Posted at 16:15 9. Oktober 2010.

Hallo Thomas,
danke für dein Kommentar, natürlich hast du recht, man kann das Ganze auch mit einem Structure lösen. Ich habe es nicht getan, da die obige Klasse noch weiterverarbeitet wird und die Properties sind dabei sehr wichtig 😉
Als einfacher Container sind Structures natürlich besser. werde ich im Artikel nachtragen.
Basti

Kommentar verfassen

View Comments (2) ...
Navigation