Как оптимизировать код поиска слов и их выделения цветом в RichTextBox - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Написал код поиска слов и их выделения цветом в RichTextBox:
Функция ColoringAllText получает массив слов, ищет каждое слово по всему тексту и выделяет его цветом, если найдет. Массив содержит всего 300 слов, весь текст весит 50Кб, а программа выделяет слова за ~7 секунд - многовато как-то. Как можно оптимизировать код?

Решение задачи: «Как оптимизировать код поиска слов и их выделения цветом в RichTextBox»

textual
Листинг программы
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim t As Date = Now
        Dim words() As String = Split("об,ее,он,она,если,или,почему,что,кто,оно,да,нет,пошел,ушел,зашел,память,гость,страшный,и,метель,каждый,олеся,олесе,ему,ей", ",")
        For Each word In words
            For Each st In Pars(RichTextBox1.Text, word, 0)
                RichTextBox1.Select(st, word.Length)
                RichTextBox1.SelectionColor = Color.Blue
                If RichTextBox1.SelectionColor = Color.Gold Then
                    RichTextBox1.SelectionLength = 0
                End If
            Next
        Next
        MsgBox(Now.Subtract(t).TotalSeconds)
    End Sub
    Function Pars(ByVal strSource As String, ByVal str1 As String, Optional ByRef startPos As Integer = 0) As Object
 
        strSource = LCase(strSource)
        Dim len As Integer = strSource.Length
        Dim strStart As String = LCase(str1)
        'Dim strEnd As String = LCase(str1.ToCharArray.ToArray.Last)
        Dim iPos As Integer, iEnd As Integer, lenStart As Integer = strStart.Length
        Dim strResult As New Hashtable
        iPos = strSource.IndexOf(strStart, startPos)
        iEnd = iPos + str1.Length
        Do While iPos <> -1 AndAlso iEnd <= len AndAlso iPos <> iEnd
 
            Dim m As String = strSource.Substring(iPos, iEnd - iPos)
            If LCase(m) = LCase(str1) Then
                strResult(iPos) = str1
                iPos = iEnd
                iPos = strSource.IndexOf(strStart, iPos)
                iEnd = iPos + str1.Length
            Else
                iPos += 1
                iPos = strSource.IndexOf(strStart, iPos)
                iEnd = iPos + str1.Length
            End If
 
        Loop
        Return strResult.Keys
    End Function
End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы