更快地在C#中为RichTextBox中的所有出现添加颜色

我有一个RichTextBox,并且有大约1000次出现的指定搜索字符串。 我使用以下函数为所有出现的颜色着色:
public void ColorAll(string s)
{
    rtbxContent.BeginUpdate();

    int start = 0, current = 0;
    RichTextBoxFinds options = RichTextBoxFinds.MatchCase;
    start = rtbxContent.Find(s, start, options);
    while (start >= 0)
    {
        rtbxContent.SelectionStart  = start;
        rtbxContent.SelectionLength = s.Length;
        rtbxContent.SelectionColor     = Color.Red;
        rtbxContent.SelectionBackColor = Color.Yellow;

        current = start + s.Length;
        if (current < rtbxContent.TextLength)
            start = rtbxContent.Find(s, current, options);
        else
            break;
    }

    rtbxContent.EndUpdate();
}
但我发现它很慢。 但是,如果我为同一文本中出现次数较少的另一个单词的所有出现着色,我发现它非常快。 所以我认为缓慢来自(这两行可能涉及UI刷新):
    rtbxContent.SelectionColor     = Color.Red;
    rtbxContent.SelectionBackColor = Color.Yellow;
是否有更快的方法来完成相同的工作,例如,我在内存中进行着色,然后我一次性显示结果? 我能说清楚吗? 谢谢。     
已邀请:
它所花费的时间与出现的次数成正比。 可能是Find正在使用最多的时间。你可以替换这一行:
    start = rtbxContent.Find(s, start + s.Length, options); 
有了这个:
    start = rtbxContent.Find(s, current, options);
由于您已计算出等于start + s.Length的电流 您还可以存储s.Length是一个变量,因此您不需要每次都计算字符串中的所有字符。 rtbxContent.TextLength也是如此。     
有一种更快的方法。 使用正则表达式查找匹配项然后在richtextbox中突出显示
    if (this.tBoxFind.Text.Length > 0)
    {
        try
        {
               this.richTBox.SuspendLayout();
               this.Cursor = Cursors.WaitCursor;

           string s = this.richTBox.Text;
           System.Text.RegularExpressions.MatchCollection mColl = System.Text.RegularExpressions.Regex.Matches(s, this.tBoxFind.Text);

           foreach (System.Text.RegularExpressions.Match g in mColl)
           {
                  this.richTBox.SelectionColor = Color.White;
                  this.richTBox.SelectionBackColor = Color.Blue;

                  this.richTBox.Select(g.Index, g.Length);
           }
   }
   finally
   {
         this.richTBox.ResumeLayout();
         this.Cursor = Cursors.Default;
   }
}
    
字符串搜索是线性的。如果你发现
Find
方法很慢,也许你可以使用第三方工具来搜索你。您所需要的只是字符串中模式的索引。 也许这会对你有所帮助。你应该计算差异并使用更快的差异。     
你正走在正确的轨道上,Winforms的慢速RichTextBox实现应该受到责备。您也可以使用BeginUpdate和EndUpdate方法(我猜你从这里拿过那些?)。但唉,这还不够。 几个解决方案: 1:尝试将RTF直接写入文本框。这是一个相当混乱,复杂的格式,但幸运的是,我在这里创建了一个答案。 2:这个评价很高的外部项目看起来也值得一看:http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting     

要回复问题请先登录注册