Zahlenbereich mit Minimum und Maximum zu Liste hinzufügen

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von fabimaurice.

    Zahlenbereich mit Minimum und Maximum zu Liste hinzufügen

    Hey,

    hab wahrscheinlich einfach nur gerade n schlechten Tag aber soviel ich auch überleg weiß ich nicht wie ich das umsetzen soll.
    Das Problem:
    Ich habe eine Maschinenprogrammdatei und soll aus dieser alle Zahlen im Bereich L9000-9999 entfernen.
    Also
    habe ich 2 NumericUp and Downs mit denen ich den gewollten
    Zahlenbereich auswählen kann, das L am Anfang ist immer festgelegt.
    Nun
    mein Ansatz bei dem sicherlich nichtmehr viel fehlt aber bin wohl
    gerade zu verpeilt verstehe nämlich nicht wie ich den Zahlenbereich mit
    minimum und Maximum der Liste hinzufüge:

    Ansatz:

    Quellcode

    1. Dim list As List(Of String)
    2. Dim max As Integer
    3. Dim min As Integer
    4. min = nummin.Value
    5. max = nummax.Value
    6. For i As Integer = min To max
    7. list.Add(i)
    8. Next i
    9. For Each s As String In list
    10. content = content.Replace("L" & s, Nothing)
    11. Next s
    12. IO.File.WriteAllText(content, list.ToString)
    13. Label1.ForeColor = Color.Green
    14. Label1.Text = "Anything is deleted"
    15. End Sub


    Egal welche Art von Hilfe, bin immer erfreut, DANKE. :)

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @fabimaurice Klassischer Fall von Debuggen, setz nen Haltepunkt drauf und klär auf, was Dein Programm macht bzw. nicht:
    Debuggen, Fehler finden und beseitigen
    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!
    @RodFromGermany
    Ich weiß ja was es macht bzw was nicht.
    Das oben ist kompletter Schwachsinn im Prinzip müsste ich wahrscheinlich den Bereich zwischen den beiden Eingaben irgendwie deklarieren und dann der Liste hinzufügen ich weiß jetzt nur nicht wie.
    Ich schau mir mal an was es beim Debuggen sagt vielleicht bekomm ich es so gelöst.
    @fabimaurice OK.
    Was soll es denn machen?
    Bitte verbal, ohne Verwendung von Code beschreiben.
    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!
    Der Code ist so nicht ausführbar.
    Hier sollten mindestens zwei Laufzeitfehler auftreten.

    Du schmeißt da auch ein bisel mit Datentypen um dich. Generell würde ich immer mit "Option Strict On" und "Option Explicit On" arbeiten.
    Wenn das mehr als ein Testprogramm ist würde ich auch die Benamung etwas überdenken.

    Dein Ansatz sollte soweit aber funktionieren. Wenn man den Aufbau der Datei kennen würde kämme man aber bestimmt auf einen kürzere Lösung.

    fabimaurice schrieb:

    Ich habe eine Maschinenprogrammdatei und soll aus dieser alle Zahlen im Bereich L9000-9999 entfernen.

    Der Ansatz ist ja schon richtig, per File.ReadAllLines kannst du alle Zeilen einlesen anschließend drüber iterieren und alle Zeilen bis auf die die du nicht möchtest in eine Liste packen & die dann wieder abspeichern. Falls am anfang immer ein "L" steht kannst du auch einfach String.Substring(1, str.Length) benutzen um den ersten char raus zu filtern und dann zu parsen.
    @cf5730
    Genau das ist ja auch mein Plan nur den Zahlenbereich zur Liste adden erscheint mir als größeres Problem als ich dachte.
    So funktionier es nicht direkt nach dem ersten "min" kommt ein Syntaxfehler. Was ist mein Problem an der Sache ist ja eigentlich sehr simpel.

    Quellcode

    1. For i As Integer = min
    2. While i <= max
    3. i += 1
    4. End While
    5. listMinMax.Add(i)
    6. Next i
    Mein Ansatz wäre genau, wie der von cf5730:
    Die Maschinenprogrammdatei zeilenweise überprüfen, ob der Wert ausserhalb des genannten Bereich ist.
    Wenn ja, dann diese Zeile in neue Liste schreiben.
    Zum Schluss die neue Liste in eine Datei speichern.

    Annahme: Pro Zeile ein Wert im Format 1 Buchstabe & Zahlen

    VB.NET-Quellcode

    1. Dim max As Integer = CInt(nummin.Value)
    2. Dim min As Integer = CInt(nummax.Value)
    3. Dim filename As String = "Maschinenprogrammdatei.txt"
    4. Dim lines As New List(Of String)(IO.File.ReadAllLines(filename))
    5. Dim output As New List(Of String)
    6. Dim i As Integer
    7. For Each line As String In lines
    8. i = CInt(line.Substring(1))
    9. If i < min OrElse i > max Then
    10. output.Add(line)
    11. End If
    12. Next
    13. IO.File.WriteAllLines("NewMaschinenprogrammdatei.txt", output.ToArray)
    Der Syntaxfehler kommt wahrscheinlich von der For-Schleife. Das müsste aber Visual Studio auch rot markieren.
    Bei deiner Schleife fehlt das "To end". Siehe auch: docs.microsoft.com/de-de/dotne…ements/for-next-statement
    Zum Beispiel:

    VB.NET-Quellcode

    1. for i as integer = 0 to 2
    2. next


    Das wird den Syntaxfehler erstmal beheben.

    Danach kommst du wahrscheinlich zum Objektverweisfehler in Zeile 8.
    Dort kannst du aber dann mal einen Haltepunkt machen und dir anschauen, welchen Wert listMinMax hat.

    fabimaurice schrieb:

    @cf5730
    Genau das ist ja auch mein Plan nur den Zahlenbereich zur Liste adden erscheint mir als größeres Problem als ich dachte.
    So funktionier es nicht direkt nach dem ersten "min" kommt ein Syntaxfehler. Was ist mein Problem an der Sache ist ja eigentlich sehr simpel.

    Ist in deinem jetzt eingefügten code so auch nicht gültig da das ende für die schleife fehlt, außerdem verstehe ich nicht ganz für was diese geschachtelte schleife gut sein soll, du benötigst lediglich eine For-Schleife und das ist die welche über die eingelesenen Zeilen iteriert und die Benötigten werte in eine neue Liste packt. (Zumindest habe ich es so verstanden das du bereits eine volle Liste hast und nur bestehende Einträge entfernen möchtest)
    Nothing ist immer dann der Standardwert eines Objektes wenn du diesem kein Wert zugewiesen hast.
    Also ist:

    VB.NET-Quellcode

    1. ​dim ListMinMax as list(of string)

    das gleiche wie

    VB.NET-Quellcode

    1. dim ListMinMax as list(of string) = nothing


    Kurz gesagt musst du die Liste erstmal instanziieren. Hierfür nutzt man das Schlüsselword "New":

    VB.NET-Quellcode

    1. dim ListMinMax as list(of string) = new List(of String)

    oder kurz geschrieben:

    VB.NET-Quellcode

    1. dim ListMinMax as new List(of String)
    @korni
    Oh Gott du hast Recht ich hab die Liste beim deklarieren nicht instanziert und habs nicht gesehen die ganze Zeit.
    Huch x.x
    Danke dir :).

    Edit:
    Das ganze funzt nicht ganz
    Die Liste hat jetzt nichtmehr Nothing drinne sondern bei Count einfach 0 also erkennt er immernoch nichts.
    @korni

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

    Eine Möglichkeit diesen Fehler zu vermeiden wäre immer einen Standardwert bei der Deklaration zu vergeben wenn dieser nicht direkt zugewiesen werden kann. So habe ich es auch in meiner Ausbildung gelernt.
    Bsp:

    VB.NET-Quellcode

    1. Dim min as integer = 0
    2. dim max as integer = 0
    3. dim listMinMax as list(of String) = Nothing
    4. max = 99
    5. min = 5
    6. listMinMax = new List(of String)


    Ist aber denke ich Geschmackssache.
    @fabimaurice in welchem Format liegen die vor?
    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!
    @Eierlein , @korni , @RodFromGermany
    Riesigen Dank euch allen hab jetzt erst verstanden wie dämlich ich mich gestern angestellt habe hat heut sofort geklappt ^^.
    Danke für die Hilfe:).


    Funzt so:
    Also Fazit: Der Loop oben war sinnlos und ich habe das Instanzieren der Liste vergessen. Wird mir hoffentlich nicht nochmal passieren :). Und die Bennenung ist dementsprechend ausgefallen da das ganze einmal benutzt wird und danach nicht nochmal^^.

    VB.NET-Quellcode

    1. Dim content = IO.File.ReadAllText("C:\Users\*********\Desktop\Mitsubishi.txt")
    2. Dim min As Integer
    3. Dim max As Integer
    4. Dim listMinMax As New List(Of String)
    5. min = nummin.Value
    6. max = nummax.Value
    7. For i As Integer = min To max
    8. listMinMax.Add(i)
    9. Next i
    10. For Each s As String In listMinMax
    11. content = content.Replace("L" & s, Nothing)
    12. Next s
    13. IO.File.WriteAllText("C:\Users\FabianSchmidt\Desktop\Mitsubishi.txt", content)
    14. Label1.ForeColor = Color.Green
    15. Label1.Text = "Anything is deleted"

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

    @fabimaurice Wie sähen denn Zahlen aus, die kleinere als 1000 oder 100 sind?
    Haben die führende Nullen?
    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!