Table/List schnell mit statischen Werten füllen (Lookup Table)

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von roepke.

    Table/List schnell mit statischen Werten füllen (Lookup Table)

    Ich habe eine Tabelle:
    0 18.52
    1 18.96
    2 19.39
    3 19.82
    usw.
    Insgesamt 400 Werte. Damit würde ich gerne eine Lookup Table erstellen.
    Im Grunde reicht mir eine List(of T), da ich dort mittels Index ja den jeweils richtigen Wert auslesen, bzw. umgekehrt anhand des Wertes den Index ermiteln.
    Die Tabelle hat 400 Einträge und die Inhalte sind statisch. Wie bekomme ich sowas schnell in eine DataTable, in ein Array oder List(of T) oder sonst was rein?
    Gibt es dafür ein Tool (alle Werte durch copy-paste einfügen) oder muss ich wirklich jeden Wert zur Laufzeit mit Add hinzufügen?
    Mit Daten -> DataSet bekomme ich es nicht hin oder ich mache was falsch.
    @roepke Wie wäre es mit einem Dictionary(Of Integer, Double)?
    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!

    roepke schrieb:

    Bekomme ich das auch via XML gefüllt?
    Wenn Linq nix hat nicht.
    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!
    @roepke
    Sowas machen wir ja derzeit bei AdventOfCode fast jeden Tag.
    Lad mal eine handvoll Daten in einer Textdatei hoch. Da wird ein Parser, der Dir die Rohdaten in eine List(Of WasAuchImmer) wandelt, vermutlich schnell geschrieben sein.
    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 habe mir jetzt eine Lösung gebastelt die funktioniert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim PT100LookUpTable As Double() = {100.0, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, 103.9, 104.29}
    2. Dim _usrt As UShort = Convert.ToUInt16(e.sData.Substring(0, 4), 16) >> 1
    3. Dim _d As Double = _usrt * 400 / 2 ^ 15
    4. Dim _dLower As Double = 0
    5. Dim _dUpper As Double = 0
    6. Dim _bEqual As Boolean = False
    7. Dim _iIndexMem As Integer = 0
    8. For _i As Integer = 0 To PT100LookUpTable.Count - 1
    9. _iIndexMem = _i
    10. If _d > PT100LookUpTable(_i) Then 'Ist [_d] > als der Wert aus der LookUpTable, dann:
    11. _dLower = PT100LookUpTable(_i) 'den aktuellen Wert als "Kleiner als [_d]" merken.
    12. ElseIf _d = PT100LookUpTable(_i) Then 'Ist [_d] = dem Wert aus der LookUpTable, dann:
    13. _dLower = PT100LookUpTable(_i) 'den aktuellen Wert als "als [_d]" merken.
    14. _bEqual = True
    15. Exit For
    16. Else 'Ist [_d] < dem Wert aus der LookUpTable, dann:
    17. _dUpper = PT100LookUpTable(_i) 'den aktuellen Wert als "Größer als [_d]" merken.
    18. Exit For
    19. End If
    20. Next
    21. 'Ggf. ermitteln welcher der beiden Werte [_dLower] oder [_dUpper] dichter an [_d] dran ist.
    22. If _bEqual = False Then
    23. If _d - _dLower < _dUpper - _d Then 'Abstand zu [_dLower] kleiner => [_iIndexMem] -1
    24. If _iIndexMem > 0 Then _iIndexMem -= 1 'Abstand zu [_dUpper] kleiner => [_iIndexMem]
    25. End If
    26. End If
    27. lbl_Test.Text = _iIndexMem.ToString