none
Object mit mehreren Feldern, wie Dictionary für 2 Werte/Felder RRS feed

  • Frage

  • Moin,

    Gibt es in Vb.net eine Möglichkeit, ein Objekt zu verwenden, dem ich mehrere Werte zuweisen kann so wie bei einem Dictionary-Objekt mit 2 Werten?

    Also bei Dictionary:
    dim citiDict As New Dictionary(Of Long, String)
    citiDict.add(22,"wert")

    Ich würde dann gerne sowas anwenden können:
    myObj.add(22,"Wert",33.4,"noch ein Wert","Erklärung oder so", usw)

    gibts das?

    (dass ich das mit Class-Variablen machen könnte wäre eine Möglichkeit, aber die müsste ich alle einzeln benenne, oder nicht?)

    Vielen Dank!

    TH

    Sonntag, 19. März 2017 11:46

Antworten

  • Hallo,

    grundsätzlich kannst du hier mit Listen bzw. Arrays arbeiten:

    Dim list As New List(Of List(Of Object))
    Dim subList As New List(Of Object)
    subList.Add(22)
    subList.Add("Wert")
    subList.Add(33.4)
    subList.Add("noch ein Wert")
    subList.Add("Erklärung oder so")
    subList.Add(usw)
    list.Add(subList)

    Du hättest dann also eine Liste von Listen mit Werten. Viel Spaß wirst du damit allerdings nicht haben, da du den Typ der Objekten in den inneren Listen nicht kennst. Das heißt du müsstest mit Option Strict Off arbeiten (auf keinen Fall zu empfehlen) oder aber alles immer wieder in typisierte Objekte casten, was es aufwendig und nicht weniger Fehleranfällig macht.

    Meiner Meinung nach solltest du lieber die Zeit investieren und eigene Klassen dafür schreiben, auch wenn du dort alles ordentlich benennen musst. Das ist deutlich besserer Quellcode (d.h. deutlich weniger Fehleranfällig und viel besser wartbar).

    Mit Tupeln kannst du das teilweise verbessern:

    Dim tuple = New Tuple(Of Integer, String, Double, String, String, Object)(22,"Wert",33.4,"noch ein Wert","Erklärung oder so", usw)
    'bzw. so hier:'
    'Dim tuple = Tuple.Create(22,"Wert",33.4,"noch ein Wert","Erklärung oder so", usw)
    
    Dann enthalten die Eigenschaften Item1 bis Item* (* ist die Anzahl der Elemente) die Werte. Das löst bereits das Typisierungsproblem, macht es aber auch nicht übersichtlicher.
    Soweit ich weiß kannst du mit der neuesten VB.NET Version genauso mit Tupeln arbeiten wie mit C#, da bin ich aber nicht umfassend informiert und die Dokumentation scheint noch sehr dürftig zu sein. Das würde einiges noch mehr vereinfachen. Aber auch da besagen die Guidelines, dass für üffentliche APIs/Schnittstellen lieber richtige Kalssen geschrieben werden sollten.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Sonntag, 19. März 2017 17:01
    Moderator

Alle Antworten

  • Hallo,

    grundsätzlich kannst du hier mit Listen bzw. Arrays arbeiten:

    Dim list As New List(Of List(Of Object))
    Dim subList As New List(Of Object)
    subList.Add(22)
    subList.Add("Wert")
    subList.Add(33.4)
    subList.Add("noch ein Wert")
    subList.Add("Erklärung oder so")
    subList.Add(usw)
    list.Add(subList)

    Du hättest dann also eine Liste von Listen mit Werten. Viel Spaß wirst du damit allerdings nicht haben, da du den Typ der Objekten in den inneren Listen nicht kennst. Das heißt du müsstest mit Option Strict Off arbeiten (auf keinen Fall zu empfehlen) oder aber alles immer wieder in typisierte Objekte casten, was es aufwendig und nicht weniger Fehleranfällig macht.

    Meiner Meinung nach solltest du lieber die Zeit investieren und eigene Klassen dafür schreiben, auch wenn du dort alles ordentlich benennen musst. Das ist deutlich besserer Quellcode (d.h. deutlich weniger Fehleranfällig und viel besser wartbar).

    Mit Tupeln kannst du das teilweise verbessern:

    Dim tuple = New Tuple(Of Integer, String, Double, String, String, Object)(22,"Wert",33.4,"noch ein Wert","Erklärung oder so", usw)
    'bzw. so hier:'
    'Dim tuple = Tuple.Create(22,"Wert",33.4,"noch ein Wert","Erklärung oder so", usw)
    
    Dann enthalten die Eigenschaften Item1 bis Item* (* ist die Anzahl der Elemente) die Werte. Das löst bereits das Typisierungsproblem, macht es aber auch nicht übersichtlicher.
    Soweit ich weiß kannst du mit der neuesten VB.NET Version genauso mit Tupeln arbeiten wie mit C#, da bin ich aber nicht umfassend informiert und die Dokumentation scheint noch sehr dürftig zu sein. Das würde einiges noch mehr vereinfachen. Aber auch da besagen die Guidelines, dass für üffentliche APIs/Schnittstellen lieber richtige Kalssen geschrieben werden sollten.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Sonntag, 19. März 2017 17:01
    Moderator
  • Danke Tom,
    Das mit den tuple hab ich mir mal angesehen. Wäre genau das was ich möchte. Allerdings geht das erst ab Framework 4.0, und mit dem kann die sqlite-Version, die ich hab nicht. Hab unlängst einen ganzen Tag damit zugebracht, sqlite für VB2010 Framework 4.0 zum laufen zu bringen, ist mir nicht gelungen. Ist aber ein anderes Thema. Jedenfalls hab ich hierauf momentan keine Lust.

    Vielen Dank für Deine Hilfe!

    Sonntag, 19. März 2017 21:12