For each schleife liest nicht bis zum letzten item

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von nichtsnutz.

    For each schleife liest nicht bis zum letzten item

    Hallo Comm.

    Ich habe folgendes Problem und finde die lösung nicht:

    VB.NET-Quellcode

    1. Dim counter As Integer = 0
    2. For Each oldtms In usertimestamp
    3. Dim ssplitter() As String = oldtms.Split(CChar(":"))
    4. If ssplitter(0).StartsWith("1") Then
    5. Dim vorherigesitm As String = usertimestamp.Item(counter)
    6. Dim jetztigesitm() As String = usertimestamp.Item(counter - 1).Split(CChar(":"))
    7. Dim zahl As Integer = CInt(jetztigesitm(1))
    8. Dim zahl2 As Integer = CInt(ssplitter(1))
    9. Dim zusammen As Integer = zahl + zahl2
    10. Dim replaceitm As String = jetztigesitm(0) & zusammen
    11. fetigeszeitmessung.Add(jetztigesitm(0) & zusammen)
    12. ListBox2.Items.Add(jetztigesitm(0) & zusammen)
    13. ElseIf ssplitter(0).StartsWith("0") Then
    14. Try
    15. Dim kukenächstezuerst As String = usertimestamp.Item(counter + 1)
    16. Dim splites() As String = usertimestamp.Item(counter + 1).Split(CChar(":"))
    17. If Not splites(0).StartsWith("1") Then
    18. fetigeszeitmessung.Add(oldtms)
    19. ListBox2.Items.Add(oldtms)
    20. End If
    21. Catch
    22. End Try
    23. End If
    24. counter += 1
    25. Next


    Ich weis das der Source jetzt nicht unbeding schön ist..... aber das Problem liegt darin dass mir das letzte Item nicht ausgegeben wird.
    Weiß zufällig jemand warum? Wird auch keine fehlermeldung ausgegeben!

    MFG

    nichtsnutz schrieb:

    Weiß zufällig jemand warum? Wird auch keine fehlermeldung ausgegeben!

    Schon mal überlegt, was das Try ... Catch Statement bewirkt ? Genau, es unterdrückt jede Fehlermeldung, egal ob Du nun durch 0 teilst, IndexOutOfRange auslöst oder Cola in die Tastatur giesst.

    Nimm das mal raus, dann wirst Du sehen was passiert. Ich setze auf Zeile 19 ;)
    Danke für die schnelle Antwort!

    Jetzt kommt folgende fehlermeldung..jedoch wird mir die zeile nicht markiert:

    {"Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.\r\nParametername: index"}
    hi,

    1. ich persönlich würde mit den namens-wirrwar nicht zurecht kommen und mir vernünftige namen ausdenken.
    2. beim kurzen überfliegen ist mir aufgefallen das du "counter" mit 0 initialisierst und in zeile 8 einen index mit "counter-1" ausliest, was -1 wäre. -->mal prüfen ob das das problem ist.7
    3. nutze try / catch nie, wenn du die exceptions nichtverarbeitest! durch unterdrücken der fehler machst du dir nur probleme!
    Ja er versucht rauszufinden ob in der nächstn zeile das wort mit 0 oder einer 1 anfängt weil die aktuelle zeile auf die nächste zeile angewisen ist wenn erste zeile 0 ist und die zweite zeile eine 1. dann muss er nämlich die zweite zeile mit der ersten addieren.
    hmmm... wie könnte man das sonst prüfen ohne auf den index los zu gehen?

    MFG

    nichtsnutz schrieb:

    hmmm... wie könnte man das sonst prüfen ohne auf den index los zu gehen?

    Du kannst natürlich prüfen ob Dein Index OutOfRange ist ... aber dann wird Dein Code noch unschöner und komplexer.

    .. oder Du schilderst uns mal genau wie die Daten aussehen und was Du damit vorhast: vielleicht finden wir ja eine bessere Lösung ...
    hmm okey also:

    In der For Each schleife befindet sich zb soetwas:

    Quellcode

    1. "0wise:130"
    2. "1wise:568"
    3. "0wise:852"
    4. "1wise:054"
    5. "0wise:6723"
    6. "0habor:564"
    7. "1habor:973"
    8. "0habor:467"


    So.
    Nun muss ich alle die mit 0 anfangen in eine extra listbox packen.
    Das Problem dabei ist alledings dass dort wo eine 1steht diese mit der oberen die mit 0 anfängt addiert werden muss und diese addierte summe dann auch in die listbox gehört ohne jetzt die beiden mit denen addiert wurde auch hinzu zu fügen das dann die listbox so aussiet:

    "0wise:698"
    "0wise:906"
    "0wise:852"
    "0wise:6723"
    "0habor:1537"
    "0habor:467"


    So sollte das ergebniss dann aussehen.

    Dessweiteren muss ich dann alles auswerten (alles zusammenzählen) was zusammen gehört:
    Sollte so aussehen:

    Quellcode

    1. "0wise:9179"
    2. "0habor:2004"


    Wäre natürlich über eine andere lösung sehr offen :)

    Herzlichen Dank schonmal!

    EDIT: habs jetzt folgender maßen gelöst...

    VB.NET-Quellcode

    1. For i = UBound(usertimestamp.ToArray) To LBound(usertimestamp.ToArray) Step -1
    2. 'MsgBox(usertimestamp(i))
    3. Dim ssplitter() As String = usertimestamp(i).Split(CChar(":"))
    4. If ssplitter(0).StartsWith("0") Then
    5. ListBox2.Items.Add(usertimestamp(i))
    6. ElseIf ssplitter(0).StartsWith("1") Then
    7. Dim ssplitter2() As String = usertimestamp(i - 1).Split(CChar(":"))
    8. Dim ssplitter3() As String = usertimestamp(i).Split(CChar(":"))
    9. Dim zahl As Integer = CInt(ssplitter3(1))
    10. Dim zahl2 As Integer = CInt(ssplitter2(1))
    11. Dim zusammen As Integer = zahl + zahl2
    12. Dim replaceitm As String = ssplitter2(0) & zusammen
    13. ListBox2.Items.Add(replaceitm)
    14. i = i - 1
    15. End If
    16. Next i


    Ich lese einfach die liste rückwerts :)

    Danke für eure hilfe!!!

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

    Liste Sortieren und Zahl addieren pls help

    Sorry für neues thema aber hatte das alte zu schnell geschlossen (anderer topic) :(

    Quellcode

    1. (Achtung! Dieses Thema wurde als erledigt markiert. Bitte erstelle ggf. ein neues Thema. )


    Wie in dem anderen Topic erwähnt habe ich es nun endlich (wenn auch etwas unsauber) nun die 0 und 1sen zu addieren.
    Jedoch habe ich jetzt keine Idee wie ich alle namensgleichen zusammen addieren soll:

    Habe nun die Resultate in einer List Of String:

    Quellcode

    1. 0thfl:512
    2. 0thfl:531
    3. 0thfl:519
    4. 0recl:299
    5. 0recl:228
    6. 0recl:348
    7. 0recl:290
    8. 0wise:380
    9. 0wise:345
    10. 0wise:330
    11. 0wise380
    12. 0avm:2


    Wie mache ich das am besten jetzt dass er alle namensgleichen zusammenrechnet und ausgibt?
    Ausgabe dann ca so:

    Quellcode

    1. 0thfl:Ergebniss
    2. 0recl:Ergebniss
    3. 0wise:Ergebniss
    4. 0avm:Ergebniss


    Vielen Dank für die vorherigen Antworten auch nochmal!!! Tolle Community!!
    Du könntest die Liste mit einer Schleife durchlaufen, den aktuellen Wert nach einem Doppelpunkt splitten und prüfen welchen Wert du gerade hast.
    Dann könntest du eine 2 Liste erstellen und dort die Werte eintragen.
    Dann prüfst du mit Consits("0recl") zum Beispiel ob der Wert schon vorhanden ist wenn nicht, addest du ihn in der Liste. Wenn er vorhanden ist addierst du einfach die Zahlen dazu.

    Das ist so das erste was mir jetzt einfällt! ;)

    VB.NET-Quellcode

    1. Dim L As New List(Of Tuple(Of String, Integer))
    2. L.Add(New Tuple(Of String, Integer)("A", 2))
    3. L.Add(New Tuple(Of String, Integer)("B", 2))
    4. L.Add(New Tuple(Of String, Integer)("C", 2))
    5. L.Add(New Tuple(Of String, Integer)("A", 4))
    6. L.Add(New Tuple(Of String, Integer)("C", -2))
    7. Dim ret = From t In L
    8. Group t By NameID = t.Item1
    9. Into g = Group
    10. Select New With {NameID, .Summe = g.Sum(Function(zz) As Integer
    11. Return zz.Item2
    12. End Function)}
    @Threadersteller:
    Du hast das Thema nicht "geschlossen", sondern nur als "erledigt" markiert. Diese Markierung verschwindet wieder, wenn du etwas Neues zum Thema schreibst.
    Die Meldung vom Forum "(Achtung! Dieses Thema wurde als erledigt markiert. Bitte erstelle ggf. ein neues Thema. )" sagt aus, dass der Ersteller dieses Threads hat, was er braucht.
    In deinem Fall hattest du noch was zu diesem Thema zu fragen, also ist das Weiterschreiben im Thread in Ordnung.

    Topics zusammengefügt.
    @picoflop

    Vielen Dank für deine Hilfe!
    Jedoch musste ich deinen Code etwas umändern dass er so halb funktionierte in:

    VB.NET-Quellcode

    1. Dim L As New List(Of KeyValuePair(Of String, Integer))
    2. L.Add(New KeyValuePair(Of String, Integer)("A", 2))
    3. L.Add(New KeyValuePair(Of String, Integer)("B", 2))
    4. L.Add(New KeyValuePair(Of String, Integer)("C", 2))
    5. L.Add(New KeyValuePair(Of String, Integer)("A", 4))
    6. L.Add(New KeyValuePair(Of String, Integer)("C", -2))


    jedoch gelingt es mir nicht jetzt die Value der doppelten Strings mit deiner funktion zusammen zu rechnen.

    VB.NET-Quellcode

    1. Dim ret = From t In L Group t By NameID = t.Item1 Into g = Group Select New With {NameID, .Summe = g.Sum(Function(zz) As Integer Return zz.Item2 End Function)}


    Ich weiß da echt nicht mehr weiter und würd mich sehr über einen Tipp freuen :)

    Vielen herzlchen Dank!

    MFG
    Danke Picoflop aber das ist genau der selbe Code wie oben.

    VB.NET-Quellcode

    1. Dim ret = From t In L


    L wird unterringelt.

    Quellcode

    1. Fehler1Ein Ausdruck vom Typ "System.Collections.Generic.List(Of System.Collections.Generic.KeyValuePair(Of String, Integer))" kann nicht abgefragt werden. Stellen Sie sicher, dass kein Assemblyverweis und/oder Namespaceimport für den LINQ-Anbieter fehlt.C:\Users\Home\Documents\Visual Studio 2010\Projects\KeyValuePair Funktion\KeyValuePair Funktion\Form1.vb1829KeyValuePair Funktion


    Fehlt mir das ev. ein Import oder so? kenn mich mit LINQ nicht aus?

    Noch nen Tipp? ^^

    Danke mfg

    EDIT: soweit ich jetzt gelesen habe unterstützt LINQ kein framework 2 sonder 4 ist das richtig? (Desswegen auch kein Import möglich?)

    EDIT2: ok das Problem lag daran :) da ich mich nicht auskenne mit der Linq wollt ich ma fragen ob du mir den Code etwas erklären könntest (wie man damit addiert, wie man den rückgabe wert herausbekommt den man dann als ergebniss in eine listbox schreiben kann und so?) also in weis das die ergebniss in der ret variable stecken. doch wie verarbeitet man die weiter?

    EDIT:3 ^^


    VB.NET-Quellcode

    1. For Each rr In ret
    2. MsgBox(rr.NameID)
    3. Next


    Herzlchen Dank!

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