Optimierung Text generieren aus Struktur

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

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

    Optimierung Text generieren aus Struktur

    Hallo,

    ich möchte einen gleichbleibenden Text an bestimmten Stellen mit beliebigen Infos füllen können, sozusagen ein leeres Formular automatisch ausfüllen.
    ich habe mir dazu mal ein Beispielprogramm in kleiner Version überlegt bei dem ich versucht habe die Einfüllinformation als eine Structure zu bündeln, vielleicht ist das zu umständlich? Die Infos werden mit einem Stringbuilder eingefügt. Es soll für verschiedene Tiere gehen, jetzt hab ich hier natürlich nur einmal alles händisch über Textboxen eingegeben, die Informationen sind später schon vorhanden zu den Tieren und dann braucht es z.B nur die Angabe der Art.
    Was meint ihr gibt es bessere Optionen?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim lstDetail As New List(Of String)
    4. For Each tb In {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6}
    5. lstDetail.Add(tb.Text) 'Einlesen der Basisinformation nur zu Testzwecken
    6. Next
    7. Dim Tier As New Animal(lstDetail)
    8. rtb.Text = Tier.info
    9. End Sub
    10. End Class
    11. Public Structure Animal
    12. Private Const basetext As String = "Die Art +01 gehört zur " & vbLf & "Gattung der +02 aus der " & vbLf & "Familie der +03 aus der " & vbLf & "Ordnung der +04 aus der " & vbLf & "Klasse der +05 aus dem " & vbLf & "Stamm der +06"
    13. Private Art, Gattung, Familie, Ordnung, Klasse, Stamm As String
    14. Public Sub New(details As List(Of String))
    15. Art = details(0)
    16. Gattung = details(1)
    17. Familie = details(2)
    18. Ordnung = details(3)
    19. Klasse = details(4)
    20. Stamm = details(5)
    21. End Sub
    22. Public Function info() As String
    23. Dim sbinfo As New StringBuilder(basetext)
    24. Dim i As Integer = 1
    25. For Each ocg In {Art, Gattung, Familie, Ordnung, Klasse, Stamm}
    26. If ocg Like "" Then
    27. ocg = "Unbekannten"
    28. End If
    29. sbinfo.Replace("+0" & i, ocg)
    30. i += 1
    31. Next
    32. Return sbinfo.ToString
    33. End Function
    34. End Structure


    Viele Grüße

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

    Willkommen im Club der Erfinder des Rades! ;)
    Du hast die String.Format-Funktion erfunden.
    Probierma dies:

    VB.NET-Quellcode

    1. imports microsoft.visualbasic.controlchars
    2. Private Shared Function info(animalDetail As List(Of String)) As String
    3. Const basetext As String = "Die Art {1} gehört zur {0}Gattung der {2} aus der {0}Familie der {3} aus der {0}Ordnung der {4} aus der {0}Klasse der {5} aus dem {0}Stamm der {6}"
    4. Return String.Format(basetext, Lf, animalDetail(0), animalDetail(1), animalDetail(2), animalDetail(3), animalDetail(4), animalDetail(5), animalDetail(6))
    5. End Function
    Allerdings heutzutage greift man eher auf String-Interpolation zurück:

    VB.NET-Quellcode

    1. Private Shared Function info({animalDetail As List(Of String)) As String
    2. Return $"Die Art {animalDetail(0)} gehört zur {Lf}Gattung der {animalDetail(1)} aus der {Lf}Familie der {animalDetail(2)} aus der {Lf}Ordnung der {animalDetail(3)} aus der {Lf}Klasse der {animalDetail(5)} aus dem {Lf}Stamm der {animalDetail(6)}"
    3. End Function

    (wobei ich allerdings zugebe, dass man da mit einem StringBuilder noch einiges an Performance rausholen könnte)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    (wobei ich allerdings zugebe, dass man da mit einem StringBuilder noch einiges an Performance rausholen könnte)
    :D Ich hau mich wech, wenn ich das lese und mir dann Deine Argumentation bzgl. Performance und StringBuilder hervorkrame.
    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“ ()

    String.Format kenne ich sogar... Ich dachte mir irgendwie kommt mir das bekannt vor.

    Die Format-Funktion kriege ich nicht in eine Schleife, oder?

    Ich hatte auch versucht die Zuweisung in eine Schleife zu packen. Aber dafür müsste ich den Variablennamen irgendwie durchlaufen können ähnlich wie bei den tbs

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

    Was erhoffst Du Dir davon, die String.Format-Funktion in eine Schleife zu packen? Technisch gesehen geht es. Aber wozu? Nenn mal ein paar Beispiele für den Sollzustand. Was willst Du ins Programm reingeben, was soll rauskommen.
    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.
    Naja ich habe mir gedacht je mehr details das denn werden, desto unübersichtlicher wird mir der ganze String. Also ich erhoffe mir davon bessere Lesbarkeit

    Aber das Prinzip bleibt eigentlich wie gezeigt. Ich benötige einen String, geschätzt hat der wohl 15000 Zeichen. Der größte Teil besteht aus immer dem gleichen Anteil, das hab ich hier Formular genannt.
    Aber dann muss ich da entsprechend andere Werte einsetzen können die Details schätzungsweise wären das so 40 Stück.

    Ich muss also wahrscheinlich den basestring sowieso irgendwie aufteilen um da Übersicht reinzukriegen oder ich baue mir den Basestring schon aus einem Stringbuilder oder einer List(Of String) wie ihr vorgeschlagen habt.
    Njaaa … das war jetzt nicht gerade eine Ansammlung von Beispielen, die ich erfragt hatte.
    Aber grundsätzlich ginge auch Folgendes:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim TemplateTextParts As New List(Of String) From {"Wenn man in der Programmierung ein generelles Beispiel geben will, verwendet man gerne den Variablenname ",
    3. ". Benötigt man einen weiteren, käme dann ",
    4. " und weiter geht es mit ",
    5. ". Es gibt natürlich noch weitere Pseudonamen, aber irgendwann sollte man sich Gedanken über die Komplexität des Beispiels machen …"}
    6. Dim WordsToInsert As New List(Of String) From {"Foo", "Bar", "Bazz"}
    7. Dim FinalText As New Text.StringBuilder
    8. For i = 0 To TemplateTextParts.Count - 1
    9. FinalText.Append(TemplateTextParts(i))
    10. If i < WordsToInsert.Count Then FinalText.Append(WordsToInsert(i))
    11. Next
    12. TxtResult.Text = FinalText.ToString
    13. End Sub
    Bilder
    • Result.png

      3,96 kB, 314×127, 48 mal angesehen
    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.
    Und? Klappt alles wie gewünscht? Oder sind noch offene Fragen?
    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.
    Im Endeffekt schon, die Übersichtlichkeit leidet einfach aufgrund der Größe ich denke es geht gar nicht besser im Code, ich habs jetzt in eine Einstellung gepackt und arbeite mit einer Schleife zum Einsetzen, da die Format Funktion eben auch beliebig wächst. Aus den Augen aus dem Sinn^^
    Da gibts auch sowas wie System.Collections.Specialized.StringCollection, mit Insert, das hab ich aber noch nicht umgesetzt, klingt aber gut und ist ähnlich zu der List(Of String) schätze ich.

    Gibts allgemein einen Unterschied lieber einen großen String in einer Einstellung ganz zu speichern oder stückhaft in einem Array-ähnlichen Gebilde aufgeteilt, abseits von der späteren Handhabung, wie Indizierung o.ä.?
    Z.B. rufe ich ganz oben ja vermutlich zum Einfügen immer den gesamten String auf, beim Zusammenbauen wie du es machst, hab ich ja für jeden Schritt nur kleine Teile.
    Ob jetzt ein String oder ein Array o.ä. dürfte egal sein. Kommt aber wohl ein stückweit auf die Textmenge drauf an, da ein String nicht ewig viel speichern kann. Aber ich glaub nicht, dass Du vor hast, den Text eines ganzen Buches zu speichern, oder?
    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.