Arrays in einem großen Array zusammenfassen mit Typumwandlung

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Arrays in einem großen Array zusammenfassen mit Typumwandlung

    Ich habe mehrere Arrays, die ich in einem Großen zusammenfassen möchte.
    Es haben aber nicht alle Arrays denselben Typ.

    Hier ein Beispiel bei dem aber die Typumwandlung fehlt

    VB.NET-Quellcode

    1. Dim ArrayStr(9) As String
    2. Dim ArrayDate(9) As Date
    3. Dim ArrayBeide(19) As String
    4. Array.Copy(ArrayStr, 0, ArrayBeide, 0, 10)
    5. Array.Copy(ArrayDate, 0, ArrayBeide, 10, 10)
    Wenn Du Dim ArrayBeide(19) As Object schreibst, geht es. Aber was willst Du dann mit dem gemischten Array anfangen?
    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 schrieb:

    Aber was willst Du dann mit dem gemischten Array anfangen?


    Ich habe ein Programm mit String, Date und einem Boolean Array. Die ganzen Daten muß ich speichern und bei einem neustart des Programms laden.
    Für das speichern eines Date Arrays habe ich hier den Vorschlag bekommen es als String zu speichern.

    VB.NET-Quellcode

    1. File.WriteAllLines(FileName, Datum.Select(Function(x) x.ToString))
    2. Datum = File.ReadAllLines(FileName).Select(Function(x) Date.Parse(x)).ToArray

    Was auch gut funktioniert. Nur muß ich so mehrere Dateien speichern.
    Würde gerne alle Daten in einem großes String Array speichern und nach dem Laden wieder in die verschiedene Arrays kopieren.

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

    @Elephant

    Mit dem BinaryWriter kannst du alles so speichern und wieder laden wie du willst.

    Wenn es in der Datei lesbar sein soll, dann kommt wahrscheinlich eher StreamWriter in Frage.

    Der String muss als Char-Array in die Datei geschrieben werden, und DateTime als Ticks (Long-Datentype).

    den Vorschlag von @ISliceUrPanties über die Klasse finde ich auch gut. Es muss aber schlussendlich für dich wie auch für dein Vorhaben stimmen.

    Freundliche Grüsse

    exc-jdbi

    Elephant schrieb:

    Für das speichern eines Date Arrays habe ich hier den Vorschlag bekommen es als String zu speichern.
    Date-Array ok, aber bitte keine gemischten Arrays verwenden, vor allem nicht zur Abspeicherung irgendwelcher Daten. Ich stimme @ISliceUrPanties absolut zu. Klasse erstellen und persisteren. Ich bevorzuge JSON.
    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.
    @Elephant Sieh Dir mal das an:
    Form mit RTB und zwei Buttons:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' schnelle Möglichkeit, ein Single Array nach Double konvertieren:
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim sa() As Single = {1, 2, 3, 4}
    5. Dim sd() As Double = Array.ConvertAll(sa, New Converter(Of Single, Double)(AddressOf SingleToDouble))
    6. ' Ausgabe
    7. Me.RichTextBox1.Clear()
    8. For Each d In sd
    9. Me.RichTextBox1.AppendText(d & Environment.NewLine)
    10. Next
    11. End Sub
    12. ' schnelle Möglichkeit, ein String Array nach Integer konvertieren:
    13. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    14. Dim MeinString As String = "10;20;30,40"
    15. Dim MeineListe As List(Of Integer)
    16. Dim MeinArray() As String = MeinString.Split(New Char() {";"c, ","c})
    17. Dim MyInt() As Integer = Array.ConvertAll(MeinArray, New Converter(Of String, Integer)(AddressOf StringToInt))
    18. MeineListe = MyInt.ToList
    19. ' Ausgabe
    20. Me.RichTextBox1.Clear()
    21. For Each d In MeineListe
    22. Me.RichTextBox1.AppendText(d & Environment.NewLine)
    23. Next
    24. End Sub
    25. ' Converter Functions
    26. Function SingleToDouble(ByVal s As Single) As Double
    27. Return CDbl(s)
    28. End Function
    29. Function StringToInt(ByVal s As String) As Integer
    30. Return CInt(s)
    31. End Function
    32. End Class
    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!

    ISliceUrPanties schrieb:

    eine Klasse mit drei Eigenschaften anzulegen

    Mit eigener Klasse anlegen hatte ich noch nichts zu tun.
    Nach raschem Querlesen habe ich eine Klasse mit Date, String und Boolean.
    Ein Array mit der Klasse in Form1 habe ich nicht hinbekommen.
    Wenn ich die Arrays in der Klasse mache, geht es.

    VB.NET-Quellcode

    1. Public Class Daten
    2. Public Datum(3) As Date
    3. Public Grund(3) As String
    4. Public Status(3) As Boolean
    5. End Class

    Aber wie speichere/lese ich die Arrays der Klasse in einer Datei
    Langsam. Hat jedes Objekt der Klasse Daten 3 Datumsangaben, 3 Gründe und 3 Status? Dann jeweils benennen, also z.B. Herstelldatum, Lieferdatum, Verfalldatum usw.
    Wenn aber ein Objekt je nur eine Sache jat, dann brauchst Du am Ende 3 Objekte.
    Bevor es ans Speichern geht, bitte klären, was den Tatsachen entspricht.
    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.

    VB.NET-Quellcode

    1. Public Class Foo
    2. Public Datum As Date
    3. Public Grund As String
    4. Public Status As Boolean
    5. End Class
    6. 'im Form
    7. Dim DeineObjekte As New List(Of Foo) From {New Foo With {.Datum = Date.Today, .Grund = "wasauchimmer", .Status = False, New Foo, New Foo} 'Erstellung einer verlängerbaren und kürzbaren Liste aus drei neuen Klasseninstanzen


    Deine Klasse sollte so benannt werden, dass sie dem Ganzen einen klaren, verständlichen, realitätsnahen und logischen Namen gibt, abhängig davon, was modelliert werden soll. Also z.B. Car, Company, Customer, PCB, Lebewesen, Auftrag, …
    Daten ist denkbar schlecht. Alles sind Daten, wir sind in der EDV. Und Du weißt ja, wofür das D in EDV steht. Auch Grund, Datum und Status sinn denkbar schlechte Bezeichnungen. Als Pseudocode ok, aber bitte nicht in Deinem Programm!
    Public Fields, also öffentlich zugängliche Variablen sind auch ein Design-Fehler.
    Schau mal hier rein, wenn Du was über eigene Klassen als Einstieg brauchst.

    Zum Thema Speichern in einer Datei:
    Ein XMLSerializer wäre für den Anfang was: Er macht aus Deinen Daten eine XML-Datei, also eine menschenlesbare und somit auch veränderbare Textdatei in speziellem Format.
    Ein BinarySerializer speichert Deine Daten im Binärformat (nicht menschenlesbar) und Du bekommst 1:1 das Objekt zurück, welches Du gespeichert hast. Also, nicht das gleiche (also ein neues Objekt mit gleichen Daten), sondern das selbe. Wenn man das so sagen kann.
    JSON ist ähnlich wie mit dem XMLSerializer, aber flexibler.
    In welche Richtung soll es gehen, nachdem Du Dich um Deine Klasse inhaltlich gekümmert hast?
    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 schrieb:

    Pseudocode ok, aber bitte nicht in Deinem Programm!

    Sei beruhigt, das sind nicht die Bezeichnungen in meinem Programm, versuche hier nur möglichst Bezeichnungen zu nehmen, die selbsterklärend sind (wer wüsste was Foo ist).

    Also nichts mit Array, sondern wie in eine ListBox mit Add und Item.

    Kann mir im Moment noch nicht vorstellen, was für Auswirkungen "1:1 das Objekt zurück" mit sich bringt.

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

    Elephant schrieb:

    wer wüsste was Foo ist
    Viele. Das sind nämlich Stellvertreter für wahre Bezeichnungen. ;)
    Naja, im ganz Entfernen ist es so wie mit ListBox. ListBox ist aber eben ein UI-Control, welches Du auf Dein Form ziehen kannst, während eine List eben ein pures Codeobjekt ist. Wird aber sehr häufig verwendet, um variabel große Ansammlungen gleicher Objekte zu beherbergen.
    Die praktischen Unterschiede der Serialisiermethoden sind erstmal zweitrangig. Die Implementierung ist im Forum verstreut zu finden. Die Stichtworte hast Du. Vielleicht bringt noch jemand hier das ein oder andere Beispiel, mir fehlt gerade die Zeit. Ich muss leider weg.
    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 schrieb:

    Klasse erstellen

    Ich bin grade Zufällig auf Structure gestossen, da kann ich ein Array anlegen so das es sich leicht in den bestenden Code einarbeiten lässt.
    Könnte ich das statt einer Klasse nehmen und könnte ich die Daten auch mit XMLSerializer oder BinarySerializer speichern?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim ts(5) As TestStruct
    4. ts(1).Name = "Hallo"
    5. ts(1).Number = 5
    6. MessageBox.Show(ts(1).Name & ts(2).Number)
    7. End Sub
    8. Public Structure TestStruct
    9. Public Name As String
    10. Public Number As Integer
    11. End Structure
    12. End Class
    Hallo,
    du kannst auch von deiner Klasse ein Array anlegen.
    Der Unterschied zwischen Class und Struct ist, das eine ist ein Referenz- das andere ein Wertdatentyp. Man kann beides Serialisieren - der Speicherverbrauch kann bei Wertdatentypen höher sein, da z.B. bei Übergabe an eine Funktion eine Kopie deines Structs angelegt wird.
    Für Dich relevant ist wohl vor allem, dass:
    • Du statt Public Struct WasAuchImmer eben Public Class WasAuchImmer schreibst. Und End Class statt End Struct
    • Die Feinheiten der Unterschiede sind zweitrangig, daher besser sauber auf Class umstellen.
    • Was sind neben Wert-/Verweistyp noch Unterschiede: Dim X As (z.B.) String ist für Struct von überall zugänglich (also das gleiche wie Public) bei Class ist es nur innerhalb der Klasse zugänglich (also das gleiche wie Private). Daher bei der Deklaration von Klassenvariablen einfach kein Dim verwenden, sondern immer konkret werden (Public oder Private oder die anderen, falls überhaupt)
    • eine Struct-Instanz kann niemals Nothing sein, eine Klasseninstanz schon. Eine Struct-Instanz würde bei Nothing-Zuweisung nicht Nothing sein, sondern eben eine Struct-Instanz, bei der alle Werte/Variablen ihren Defaultwert haben.
    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.