List(Of Class)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Veronesi.

    List(Of Class)

    Hallo Zusammen

    Ich komme mit dem folgenden Problem einfach nicht weiter.
    Ich habe eine unbekannte Anzahl an Datensätzen. Und jeder Datensatz kann wiederum eine unbekannte Anzahl an Messwerten haben.

    Ich habe mir mal eine Klasse mit Properties angelegt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MathSensCalc
    2. Public Sub New()
    3. _ID = -1
    4. _MaxItems = 0
    5. _Values = New List(Of Double)
    6. _AddValue = 0
    7. End Sub
    8. Private _ID As Integer
    9. Public Property ID As Integer
    10. Get
    11. Return _ID
    12. End Get
    13. Set(value As Integer)
    14. _ID = value
    15. End Set
    16. End Property
    17. Private _MaxItems As Integer
    18. Public Property MaxItems As Integer
    19. Get
    20. Return _MaxItems
    21. End Get
    22. Set(value As Integer)
    23. _MaxItems = value
    24. LimitValues()
    25. End Set
    26. End Property
    27. Private _Values As List(Of Double)
    28. Public Property Values As List(Of Double)
    29. Get
    30. Return _Values
    31. End Get
    32. Set(value As List(Of Double))
    33. _Values = value
    34. LimitValues()
    35. End Set
    36. End Property
    37. Private _AddValue As Double
    38. Public WriteOnly Property AddValue As Double
    39. Set(value As Double)
    40. Dim v As List(Of Double) = Me.Values
    41. v.Add(value)
    42. Me.Values = v
    43. End Set
    44. End Property
    45. Private Sub LimitValues()
    46. If _Values.Count > _MaxItems Then
    47. If _MaxItems = 0 Then 'Delete!
    48. _ID = -1
    49. _Values.RemoveRange(0, _Values.Count)
    50. Else 'Limit to MaxItems
    51. While _Values.Count > _MaxItems
    52. _Values.RemoveAt(0)
    53. End While
    54. End If
    55. End If
    56. End Sub
    57. End Class


    Darin kann man ID und MaxItems speichern.
    Wird MaxItems verändert, oder ein Wert hinzugefügt, wird automatisch mit der Funktion LimitValues die maximale Anzahl an Einträgen begrenzt.

    Das funktioniert.

    Nun muss ich "nur noch" eine List(of dieserKlasse) machen.
    Das sieht bei mir so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim LM As New List(Of MathSensCalc)
    4. Dim MathTmp As New MathSensCalc
    5. MathTmp.ID = 1
    6. MathTmp.MaxItems = 10
    7. For i As Integer = 0 To 15
    8. MathTmp.AddValue = i
    9. Next
    10. LM.Add(MathTmp)
    11. Stop
    12. MathTmp.MaxItems = 0
    13. MathTmp.ID = 2
    14. MathTmp.MaxItems = 3
    15. For i As Integer = 0 To 15
    16. MathTmp.AddValue = i
    17. Next
    18. LM.Add(MathTmp)
    19. MathTmp.MaxItems = 0
    20. Stop
    21. End Sub
    22. End Class


    Lasse ich das bis zum ersten Stop laufen, ist alles gut. In LM stehen alle Werte korrekt.
    Steppe ich danach aber weiter, bis MathTmp.MaxItems = 0 ausgeführt wird, dann wird auch in LM alle Werte gelöscht.

    Was mache ich Anfänger hier falsch?

    Veronesi
    Hallo Sonne75

    Danke :)
    Aber die Daten kommen bereits aus einem DataSet.
    Ich wollte hier eine Art "Zwischenspeicher" mit speziell ausgewählten Daten haben, die dann in einem zweiten Thread verrechnet werden.
    Dann kann ich nicht mehr auf das erste DataSet zugreifen, weil diese Daten sich dann laufend (während der komplizierten Berechnung) verändern.

    Klar, ich könnte ein zweites DataSet nehmen und dort die Daten einspeichern. Wäre vielleicht die Beste Methode.
    Aber warum läuft das Andere nicht?

    Veronesi schrieb:

    VB.NET-Quellcode

    1. Dim LM As New List(Of MathSensCalc)
    Pack diese Zeile aus der Prozedur in die Klasse.
    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!
    Hey,

    Du musst schon jedes mal eine neue Instanz Deiner Klasse erstellen. Momentan arbeitest Du stets mit der selben Instanz.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Veronesi schrieb:

    Dim MathTmp As New MathSensCalc

    An dieser (einzigen) Stelle instanzierst du dein MathSensCalc-Objekt. Du änderst ein paar seiner Eigenschaften, dann fügst du es der List(Of MathSensCalc) hinzu.

    Nun verhält es sich aber so, dass MathTmp eigentlich nur ein Verweis auf dein oben erstelltes Objekt ist. Wenn du also nach dem ersten Stop anfängst, seine Werte zu ändern und es mit den geänderten Werten erneut der Liste hinzufügst, hast du eigentlich nur dasselbe Objekt zwei Mal in deiner Liste. Und durch die Änderung der Eigenschaften hast du zudem auch die Eigenschaften des zuerst hinzugefügten Elements geändert.

    Füge nach dem ersten Stop

    VB.NET-Quellcode

    1. MathTmp = New MathSensCalc()
    ein und dein Beispiel sollte wie gewünscht funktionieren.
    Oder allgemeiner: Wann immer du ein neues MathSensCalc-Objekt brauchst, um es deiner Liste hinzuzufügen, solltest du auch entsprechend eine neue Instanz (Schlüsselwort New) erstellen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.