Zählung eines Wertes bis zu einem anderen Wert

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Xylon.

    Zählung eines Wertes bis zu einem anderen Wert

    Hey, ich mal wieder. Ich habe eine rtb mit Allerhand Daten (In hexadezimal). Ich möchte jetzt gerne eine Zählerfunktion einbauen, die die Anzahl des vorkommens eines bestimmten Wertes bis zu einem anderen zählt. Habs schon mit InStr, Contains, Split und IndexOf probiert, aber irgendwie scheint das nicht wirklich zu funktionieren, weil man hier nirgends Anfang und Ende der Suche bestimmen kann.

    Keines Beispiel:
    Wenn man jetzt z.B. nach "Hallo" suchen wollen würde, und "Hallo" insgesamt 10 mal vorhanden ist, und ich die Anzahl an "Hallo"s bis zu dem Wort "Welt" zählen wollen möchte, wie könnte man das machen? Zunächst dachte ich daran 2 deklarationen als Start und Endpunkt festzulegen, aber kann man damit dann auch suchen? Also z.B.

    VB.NET-Quellcode

    1. Dim start As Integer = 0
    2. Dim searchobject As Integer = tempcode
    3. Dim ende As Integer = 100


    So würde ich von Zeichen 0 - 100 zählen wollen wie oft "tempcode" vorhanden ist. Aber mit InStr usw. funktioniert das wie gesagt nicht...

    Danke schonmal im Voraus :thumbsup:
    @Xylon
    Hi,

    ich würde es mit Linq machen.
    Das bis zu einem anderen, da gibt es viele Möglichkeiten. Guck dir dazu mal die Methoden einer Liste im Objektbrowser an.
    Schau mal das hier Dim i As Integer = liste.IndexOf("hallo")

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Linq
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim liste As New List(Of String)
    6. For Each l As String In RichTextBox1.Lines
    7. liste.Add(l)
    8. Next
    9. Dim matchQuery = From word In liste
    10. Where word.ToLower = "hallo".ToLower
    11. Select word
    12. ' Count the matches.
    13. MessageBox.Show(matchQuery.Count().ToString())
    14. End Sub
    15. End Class
    Dann solltest du den Code auf Integer umschreiben ...

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Linq
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim liste As New List(Of Integer)
    6. For Each l In RichTextBox1.Lines
    7. liste.Add(Integer.Parse(l))
    8. Next
    9. Dim matchQuery = From int In liste
    10. Where int = 10
    11. Select int
    12. ' Count the matches.
    13. MessageBox.Show(matchQuery.Count().ToString())
    14. End Sub
    15. End Class
    Dann probier es mal so :)

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Linq
    3. Public Class Form1
    4. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim lines As List(Of String) = Me.RichTextBox1.Text.Split(CChar(vbLf)).ToList()
    6. Dim liste As List(Of Integer) = lines.ConvertAll(Function(str) Integer.Parse(str))
    7. Dim matchQuery = From int In liste
    8. Where int = 10
    9. Select int
    10. ' Count the matches.
    11. MessageBox.Show(matchQuery.Count().ToString())
    12. End Sub
    13. End Class
    @LaMiy

    mediafire.com/?9xos31vn3y3vmfd

    Hier ist mal mein Projekt. Man lädt in der linken rtb eine binäre Datei. In der txt1 schreibt man z.B. 04000024, da habe ich eine "Funktion" die die Position eines 32bit Wertes anzeigt(Siehe meine vorherigen Themen). Der 32bit Wert 00000001 ist gleich Am Anfang und ich möchte z.B. wissen wie oft 00000001 bis zur Position des Wertes 10 vorkommt(10 ist hier HextoDec(tempcode) / 4 + 1).

    Xylon schrieb:

    Ich habe eine rtb mit Allerhand Daten (In hexadezimal).

    Xylon schrieb:

    das ich keinen String sondern einen Integer suche.
    Überleg mal genau, was Du hast und was Du willst.
    In einer RTB steht genau ein String, den Du mit RTB.Text ohne und mit RTBRtf mit ormatierung auslesen kannst.
    Ein Integer passt da nicht rein.
    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!

    Xylon schrieb:

    kann ich dann einfach +1 rechnen?
    Musst Du, denn bei .NET sind die Indizes Null-basiert.
    Wenn Du en 1. Index auf 1 haben willst, erhöhe ihn. :D
    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: Habes gerade nochmal versucht, leider ohne Erfolg, denn ganz egal was ich mache, der Wert ist immer 0. Kann ich mit dem Code den du in einem anderen Thread geschrieben hast eventuell den Start und den End Index festlegen?

    VB.NET-Quellcode

    1. Dim txt = "askljklöjhasljiklöasoiuzioutzaslökzhuöozas"
    2. Dim index = 0
    3. Do While (index >= 0)
    4. index = txt.IndexOf("as", index + 1)
    5. Debug.WriteLine(index.ToString)
    6. Loop

    VB.NET-Quellcode

    1. Dim txt = "askljklöjhasljiklöasoiuzioutzaslökzhuöozas"
    2. Dim counter As Integer
    3. Dim startindex As Integer 'ab hier wird gesucht
    4. Dim index As Integer
    5. Dim suchstring As String = "as"
    6. Do
    7. index = txt.IndexOf(suchstring, startindex)
    8. If index >= 0 Then ' Wenn "as" gefunden wurde
    9. 'zähler erhöhen
    10. counter += 1
    11. 'startindex neu setzen. Jetzt suchen wir ab hier
    12. startindex = index + suchstring.Length
    13. Else
    14. Exit Do
    15. End If
    16. Loop
    17. Debug.Print(suchstring & " wurde " & counter.ToString & "x gefunden")
    @der_Kurt
    Danke, aber wie gesagt muss ich auch einen endindex festlegen! Damit sucht der ja wie oft der suchstring insgesamt vorkommt, das ginge auch mit UBound aber das brauche ich nicht. Kann man nicht einfach einen endindex deklarieren und dann festlegen von wo bis wo der zähler bei der suche zählen soll? Wäre perfekt!
    Die einfachste Möglichkeit wäre, von Anfang an nur den zu durchsuchenden Teil des Strings mitzugeben, das machste mit String.Substring(startindex, length).
    Tipp, falls du Probleme mit dem length-Parameter haben solltest: length = endindex - startindex
    Wenn du einen Code-Teil X-Mal ausführen möchtest, dann gibt es dafür die For-Next-Schleife

    VB.NET-Quellcode

    1. For Zählervariable = Start To End Step Schritt
    2. 'Dieser Teil wird wiederholt
    3. Next


    Außerdem: wenn es dir nur darum geht, bis zu einem EndIndex zu ...wasauchimmer..., dann verlasse die Schleife einfach beim Erreichen des Endindex. (Exit Do, Exit For, Exit While, ...)
    @der_Kurt: Also könnte man mit der Zählervariable dann eine Zählerfunktion einbauen, richtig? (z.B. mit Linq oder Count) Wie ruft man denn die Zählervariable dann auf um nach "tempcode" zu suchen?

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

    @der_Kurt:
    So ich habe jetzt ein wenig rumprobiert:

    VB.NET-Quellcode

    1. Dim startindex As Integer 'ab hier wird gesucht
    2. Dim index As Integer
    3. Dim region2 = Mid(RichTextBox3.Text, 1, position)
    4. Dim suchstring As String = tempcode
    5. Do
    6. index = RichTextBox3.Text.IndexOf(suchstring, startindex)
    7. For Each index In region2
    8. TextBox4.Text = CStr(+1)
    9. Exit Do
    10. Next
    11. Loop

    Allerding weiß ich nicht in welchen Typ ich region2 Konvertieren soll (So wird das als falsch angezeigt). Ich würde jetzt halt gerne wissen ob mit dieser Schleife dann für jeden index auch + 1 in die txt eingetragen wird oder ob ich mich da irgendwo vertan hab.
    Danke schonmal im Voraus! :rolleyes:

    @RodFromGermany:, @LaMiy:, @nafets3646:

    Ich habe nun eine perfekte Lösung gefunden:

    VB.NET-Quellcode

    1. Dim regi1 As String = Mid(RichTextBox3.Text, 1, CInt(TextBox2.Text))
    2. Dim firstin As String = CStr(regi1.IndexOf(tempcode, 1))
    3. Dim secin As String = CStr(regi1.LastIndexOf(tempcode, 1))
    4. TextBox7.Text = firstin.ToString
    5. TextBox9.Text = secin.ToString

    Das Problem ist, dass hier immer -1 angezeigt wird....weiß irgendjemand eine Lösung? Das wäre echt Klasse weil mehr brauch ich nicht :)

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

    Xylon schrieb:

    Ich habe nun eine perfekte Lösung gefunden:
    Die ist doch wohl eher suboptimal.
    Du hast Integer-Werte, die Du als Strings rumschleppst.
    Verlagere die Funktion der TextBox2 in ein NumericUpDown.
    Speichere die Werte IndexOf(), LastIndexOf() als Integer und konvertiere sie zur Ausgabe in einen String.
    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!