ListOf(Double... zu ListOf(String....

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    ListOf(Double... zu ListOf(String....

    Moin moin zusammen

    Ich habe hier ein Problem mit "ListOf" und deren Anzeige in einer Textbox / Label.
    Habe mir nun den Kopf zerbrochen, wie ich die erste ListOf in einer Textbox so darstellen kann, das man mit den Werten etwas anfangen kann. Bei einigen Werten aus der ersten ListOf ist das noch kein Problem aber bei solchen Werten " 0.8, 0.6 usw " 1/1.3, 1/1.6 " wird das echt eine Katastrophe. :cursing:

    Um nun dem Dilemma mit der nicht funktionierenden Konvertierung von Double usw zu entkommen, habe ich die zweite ListOf(String..) generiert und lasse dann halt beide gleichzeitig abfragen.

    Nun meine Frage: Geht das alles nicht auch irgendwie mit nur einer ListOf :?:

    Spoiler anzeigen

    In der Class: (Auszug)

    VB.NET-Quellcode

    1. Public Class ListOfReihen
    2. Friend CurrentShutterIndex As Integer = 0
    3. Friend CurrentShutterValues As List(Of Double)
    4. Friend CurrentShutterValuesString As List(Of String)
    5. '' fürs berechnen und anzeige im Label (label kommt später weg)
    6. Friend ShutterValuesThird As List(Of Double) = New List(Of Double) From {30, 25, 20, 15, 13, 10, 8, 6, 5, 4, 3, 2.5, 2, 1.6, 1.3, 1, 0.8, 0.6, 0.5, 0.4, 0.3, 1 / 4, 1 / 5,.....}
    7. '' für die Anzeige in der Textbox
    8. Friend ShutterValuesThirdStrings As List(Of String) = New List(Of String) From {"30", "25", "20", "15", "13", "10", "8", "6", "5", "4", "3", "2.5", "2", "1.6", "1.3", "1", "1/1.3", "1/1.6", "1/2", "1/2.5", .....}


    Auf dem Form:(Auzug)

    VB.NET-Quellcode

    1. Private Sub btnShutterDown_Click(sender As Object, e As EventArgs) Handles btnShutterDown.Click
    2. If _listofReihen.CurrentShutterIndex > 0 Then
    3. _listofReihen.CurrentShutterIndex -= 1
    4. UpdateShutterTextBox()
    5. End If
    6. End Sub
    7. Private Sub btnShutterUp_Click(sender As Object, e As EventArgs) Handles btnShutterUp.Click
    8. If _listofReihen.CurrentShutterIndex < _listofReihen.CurrentShutterValues.Count - 1 Then
    9. _listofReihen.CurrentShutterIndex += 1
    10. UpdateShutterTextBox()
    11. End If
    12. End Sub
    13. Private Sub UpdateShutterTextBox()
    14. '' lesbare Anzeige
    15. txtShutter.Text = _listofReihen.CurrentShutterValuesString(_listofReihen.CurrentShutterIndex).ToString()
    16. '' mathematische Anzeige schon gerundet
    17. lblShutter.Text = _listofReihen.CurrentShutterValues(_listofReihen.CurrentShutterIndex).ToString("0.000000 Sekunden")
    18. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Geht das alles nicht auch irgendwie mit nur einer ListOf
    Nimm doch ein Dictionary(Of String, Double) oder Dictionary(Of Double, String).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst auch Tuples nehmen: List(Of (Wert As Double, Text As String)). Aber ich komme bei Tuple-Verwendung immer sehr schnell zum Ergebnis, dass ich gleich eine entsprechende Klasse kreiere und verwende.

    VB.NET-Quellcode

    1. Friend MyValueTextClass 'hier einen guten Namen wählen
    2. Property Value As Double
    3. Property DisplayText As String
    4. End Class
    -> List(Of MyValueTextClass)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed @RodFromGermany

    Habe das nun mit dem Directonary so umgesetzt.

    Du kannst auch Tuples nehmen

    Das habe ich nicht verstanden, wie du das meinst.

    Spoiler anzeigen

    Die Klasse:

    VB.NET-Quellcode

    1. Public Class ListOfConst
    2. Friend CurrentShutterIndex As Integer = 0
    3. Friend CurrentShutterValues As Dictionary(Of String, Double)
    4. Friend CurrentShutterValuesString As List(Of String)
    5. Friend ShutterValuesFull As Dictionary(Of String, Double) = New Dictionary(Of String, Double) From {
    6. {"30", 30}, {"15", 15}, {"8", 8}, {"4", 4}, {"2", 2}, {"1", 1}, {"1/2", 1 / 2}, {"1/4", 1 / 4}, {"1/8", 1 / 8},.........}


    Auf dem Form:

    VB.NET-Quellcode

    1. Private _listOfValues As New ListOfConst
    2. '.......
    3. Private Sub btnShutterUp_Click(sender As Object, e As EventArgs) Handles btnShutterUp.Click
    4. If _listOfValues.CurrentShutterIndex < _listOfValues.CurrentShutterValues.Count - 1 Then
    5. _listOfValues.CurrentShutterIndex += 1
    6. UpdateShutterTextBox()
    7. End If
    8. End Sub
    9. Private Sub UpdateShutterTextBox()
    10. txtShutter.Text = _listOfValues.CurrentShutterValuesString(_listOfValues.CurrentShutterIndex)
    11. lblShutter.Text = $"{_listOfValues.CurrentShutterValues(_listOfValues.CurrentShutterValuesString(_listOfValues.CurrentShutterIndex)):0.000000} Sekunden"
    12. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Das habe ich nicht verstanden, wie du das meinst.
    Tuples sind Gruppen von Einzelwerttypen, die zu einem zusammengefasst werden.

    VB.NET-Quellcode

    1. Dim Toasterpaket As (Name As String, AnzahlDerToastslots As Integer, PreisInEuro As Double) = ("Toaster", 4, 25.98)

    Aber wie geschrieben: Dann kannst Du auch gleich eine eigene Klasse nutzen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Haudruferzappeltnoch
    Der Wert/ die Anzeige " 1/1.6 " usw ist so vorgegeben.
    @VaporiZed
    Ja, OK, das mit den Tuples habe ich glaube ich verstanden. Da kann ich in einer Function mehrere verschiedene Werte zurück bekommen?

    Aber was meinst du mit eigener Klasse? Habe das doch in der eigenen "Public Class ListOfConst" oder bringe ich jetzt etwas durcheinander??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Innerhalb Deiner Klasse ListOfReihen hattest Du zum Anfang eine List(Of String) und eine List(Of Double). Um aus diesen beiden eine zu machen, verwende eine Klasse als Datenpaket.

    VB.NET-Quellcode

    1. Public Class ListOfReihen
    2. Friend CurrentShutterIndex As Integer = 0
    3. Friend CurrentShutterValues As List(Of Double)
    4. Friend CurrentShutterValuesString As List(Of String)
    5. Friend ShutterValues As List(Of ShutterValue)
    6. '…
    7. End Class
    8. Public Class ShutterValue
    9. Property Text As String
    10. Property Value As Double
    11. End Class

    Es stellt sich dann natürlich die Frage, was Deine ListOfReihen so alles kann oder ob sie ggf. gar nicht (mehr) gebraucht wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Hallo ;)
    So ganz kann ich dir noch nicht folgen, mit den Klassen.

    Ich versuche es mal:
    In der Klasse mit den ListOf lege ich mir dann z.B. 2 Listen an. :?:
    Friend ShutterValues As List(Of ShutterValue)
    Friend ShutterValues As List(Of ShutterValueNum)
    ------------------



    Nochmal zu meinem bisherigen:
    ​so alles kann oder ob sie ggf. gar nicht (mehr) gebraucht wird.

    Doch gebraucht werden die schon noch. Im Moment habe ich einen funktionierenden CodeBlock....
    Spoiler anzeigen

    Die eine Class: Hier sind Konstante Werte in Listen abgelegt. Diese rufe ich ab und lasse sie auf dem Form in einer Textbox anzeigen.

    VB.NET-Quellcode

    1. Public Class ListOfConst
    2. Friend CurrentShutterIndex As Integer = 0
    3. Friend CurrentShutterValues As Dictionary(Of String, Double)
    4. Friend CurrentShutterValuesString As List(Of String)
    5. Friend ShutterValuesThird As Dictionary(Of String, Double) = New Dictionary(Of String, Double) From {
    6. {"30", 30}, {"25", 25}, {"20", 20},..........{"0.5", 0.5}, {"0.4", 0.4}, {"0.3", 0.3}, {"1/4", 1 / 4}, {"1/5", 1 / 5}, {"1/6", 1 / 6}, {"1/8", 1 / 8}, {"1/10", 1 / 10},.........}
    7. Friend ShutterValuesThirdStrings As List(Of String) = ShutterValuesThird.Keys.ToList()

    Die andere Class:
    Hier mache ich einige Berechnungen und hole mir dann die entsprechenden Werte ( der nächst passende ) wieder aus der ListOf um sie dann auf dem Form in einem Label anzeigen zu lassen.
    So das im Label z.B. " 1/160 " <=== Das steht dann wieder im Label.




    VB.NET-Quellcode

    1. Public Class Calculation
    2. Private _listofReihen As New ListOfConst
    3. Friend Sub ApsShutterChange()
    4. Dim calculatedShutter As Double = apscShutter
    5. Dim shutterValues = _listofReihen.ShutterValuesThird
    6. Dim closestShutter As Double = Double.MaxValue
    7. For Each kvp As KeyValuePair(Of String, Double) In shutterValues
    8. If kvp.Value >= calculatedShutter AndAlso kvp.Value - calculatedShutter < closestShutter Then
    9. closestShutter = kvp.Value - calculatedShutter
    10. ClosestShutterString = kvp.Key
    11. End If
    12. Next
    13. ClosestShutterString = ClosestShutterString
    14. Debug.WriteLine("Aufgerufen")
    15. Debug.WriteLine("apscShutter: " & calculatedShutter)
    16. Debug.WriteLine("CloseShutter: " & closestShutter)
    17. Debug.WriteLine("CloseString: " & ClosestShutterString)
    18. Debug.WriteLine("---------Nach der For Each-----------")
    19. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Was kann Deine Klasse ListOfConst? Wenn die nur dafür da ist, diese Text-Wert-Paare bereitzustellen, brauchst Du die gar nicht. Eine normale Klasse ist dafür gedacht, dass es bei Bedarf mehrere Instanzen dieser Klasse gibt, die unabhängig voneinander in Aktion treten können. Wenn Du aber nur eine ListOfConst-Instanz hast und die keine Logik enthält, sondern nur die genannten Werte-Text-Paare, kann die ListOfConst-Klasse weg und Du brauchst nur Deine Datenpaar-Sammlung. Egal, ob Dictionary, List(Of (String, Double)) oder List(Of Datenpaket).
    Summa summarum: Welche Aufgabe hat Deine ListOfConst außer die Bereitstellung der Zahlen-Text-Paare?
    btw: Wenn es eh nur eine ListOfConst-Instanz geben soll, aber diese auf jeden Fall bleiben soll, solltest Du sie Shared machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Eigentlich stellt die " Class ListOfConst " nur die Zahlenpaare zur Verfügung um diese auf dem Form darzustellen und für Berechnungen in anderen Classes.
    Also die Werte werden in verschiedenen Textboxen angezeigt und mittel Button aus der Liste geholt.

    VB.NET-Quellcode

    1. Private Sub btnIsoUp_Click(sender As Object, e As EventArgs) Handles btnIsoUp.Click
    2. If _listOfValues.CurrentISOIndex < _listOfValues.CurrentISOValues.Count - 1 Then
    3. _listOfValues.CurrentISOIndex += 1
    4. UpdateOtherParameters(CType(sender, Button))
    5. UpdateISOTextBox()
    6. End If
    7. End Sub



    Bitte erkläre mir warum die Class oder die ListOf dann auf Shared soll / muss / kann :?:
    Welchen Vorteil hat das usw.... :?:

    Danke :)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Variante 1: Du packst die Daten wie ShutterValuesThird (also die Ansammlung Deiner Wertepaare) und CurrentISOIndex in die Form-Klasse und wirfst die ListOfConst-Klasse weg:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private CurrentShutterIndex As Integer = 0
    3. Private ShutterValuesThird As New Dictionary(Of String, Double) From {
    4. {"30", 30}, {"25", 25}, {"20", 20},..........{"0.5", 0.5}, {"0.4", 0.4}, {"0.3", 0.3}, {"1/4", 1 / 4}, {"1/5", 1 / 5}, {"1/6", 1 / 6}, {"1/8", 1 / 8}, {"1/10", 1 / 10},.........}


    Variante 2: Du behältst die Klasse und machst sie Shared. Dann musst Du sie nicht mit New instanziieren, sondern greifst über den Klassennamen auf die Daten zu:

    VB.NET-Quellcode

    1. Public Shared Class ListOfConst
    2. Friend Shared CurrentShutterIndex As Integer = 0
    3. Friend Shared ShutterValuesThird As Dictionary(Of String, Double) = New Dictionary(Of String, Double) From {
    4. {"30", 30}, {"25", 25}, {"20", 20},..........{"0.5", 0.5}, {"0.4", 0.4}, {"0.3", 0.3}, {"1/4", 1 / 4}, {"1/5", 1 / 5}, {"1/6", 1 / 6}, {"1/8", 1 / 8}, {"1/10", 1 / 10},.........}
    5. End Class
    6. Public Class Form1
    7. Private Sub btnIsoUp_Click(sender As Object, e As EventArgs) Handles btnIsoUp.Click
    8. If ListOfConst.CurrentISOIndex < ListOfConst.CurrentISOValues.Count - 1 Then
    9. ListOfConst.CurrentISOIndex += 1
    10. UpdateOtherParameters(CType(sender, Button))
    11. UpdateISOTextBox()
    12. End If
    13. End Sub
    Shared Classes sind dann sinnvoll, wenn Du zwar die Funktionalitäten von Klassen nutzen willst, aber es keinen Sinn ergäbe, dass es Du mehrere Objekte der Klasse verwendest, die unabhängig voneinander existieren und manipuliert werden können. Du willst nur einen Datencontainer.

    Datenhaltungsvarianten:
    1. Dictionary. Hast Du schon, also

    VB.NET-Quellcode

    1. Friend ShutterValuesThird As New Dictionary(Of String, Double) From {{"30", 30}, {"25", 25}, {"20", 20},..........{"0.5", 0.5}, {"0.4", 0.4}, {"0.3", 0.3}, {"1/4", 1 / 4}, {"1/5", 1 / 5}, {"1/6", 1 / 6}, {"1/8", 1 / 8}, {"1/10", 1 / 10},.........}


    2. Tuples

    VB.NET-Quellcode

    1. Friend ShutterValuesThird As New List(Of (DisplayText As String, Value As Double)) From {("30", 30), ("25", 25), ("20", 20),..........("0.5", 0.5), ("0.4", 0.4), .........}


    3. eigene Datenklasse

    VB.NET-Quellcode

    1. Friend Class DataPair
    2. Property DisplayText As String
    3. Property Value As Double
    4. End Class
    5. '…
    6. Friend ShutterValuesThird As New List(Of DataPair) From {New DataPair With {.DisplayText = "30", Value = 30}, New DataPair With {.DisplayText = "25", Value = 25}), .........}

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich denke Vapo meint die Member der Class ListOfConst können auf Shared. Denn Klassen selbst können nicht Shared sein.
    Wenn das ein Ablagestapel für mehr oder minder feste Werte ist, dann ist das erzeugen einer Instanz ein Mehraufwand der nicht nötig ist.

    Hier ein Beispiel in drei Varianten

    VB.NET-Quellcode

    1. Friend Class TestA
    2. Friend test as String = "Hallo Welt"
    3. End Class
    4. ''Aufruf:
    5. Dim a as New TestA
    6. Console.Writeline(a.test)
    So hast du es im Moment.

    VB.NET-Quellcode

    1. Friend Class TestA
    2. Friend Shared test as String = "Hallo Welt"
    3. End Class
    4. ''Aufruf:
    5. Console.Writeline(TestA.test)
    Damit spart man sich schonmal das Erzeugen der Instanz und gegebenfalls wird das Erzeugen des/der Member an einen besseren Zeitpunkt gelegt (In diesem Falle natürlich völlig egal).

    VB.NET-Quellcode

    1. Friend Class TestA
    2. Friend Const test as String = "Hallo Welt" 'Das ist automatisch ReadOnly
    3. End Class
    4. ''Aufruf:
    5. Console.Writeline(TestA.test)
    Das ist noch "konstanter", man spart sich wie zuvor die Instanz der Klasse und diese Variable wird genau einmal erzeugt und zwar beim Kompilieren. Da läuft also gar kein Code mehr zur Laufzeit um den Member zu erstellen.

    Ups, Vapo hats auch gleichzeitig erklärt^^

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Moin moin zusammen

    Danke für die Erklärungen. :)

    @VaporiZed
    Variante 1 fällt weg, weil ich in einer weiteren Klasse die ListOf ja noch für Berechnungen brauche und weil es mir so weniger Code, in der FormClass (Datei) macht.

    Variante 2 ist wohl das was am besten passt.
    Bei Dictonary und Tuples sehe ich gerade noch keinen Unterschied. ?(

    Bei der eigenen Datenklasse: Wäre das dann nicht "unnötig" viel Code? Und rufe ich die Werte dann auch über den Index ab? :?:

    @Haudruferzappeltnoch

    Ich wusste nicht das ​Friend Const ShutterValuesThird As New Dictionary funktioniert.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Haudruferzappeltnoch: Shared Class ist natürlich Blödsinn, haste recht. Wenn man aus dem Kopf schreibt. Und das Const-Konstrukt ist natürlich noch sinnvoller.

    Amelie schrieb:

    Und rufe ich die Werte dann auch über den Index ab?
    Klar, das ändert sich nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Amelie schrieb:

    Ich wusste nicht das Friend Const ShutterValuesThird As New Dictionary funktioniert.
    Das tut es auch nicht und das hab ich auch nie behauptet. Const geht nur mit systeminternen Typen.
    Aber sowas hast du auch:
    Friend Const CurrentShutterIndex As Integer = 0
    Es sei denn du musst den ändern. Dann bringt dir das da auch nichts. Fürs Verständnis ist es trotzdem hilfreich.