我有一个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;
是否有更快的方法来完成相同的工作,例如,我在内存中进行着色,然后我一次性显示结果?
我能说清楚吗?
感谢。
答案 0 :(得分:1)
所花费的时间与出现的次数成正比。
可能是Find正在使用最多的时间。你可以替换这一行:
start = rtbxContent.Find(s, start + s.Length, options);
用这个:
start = rtbxContent.Find(s, current, options);
因为你已计算出等于start + s.Length的电流
您还可以存储s.Length是一个变量,因此您不需要每次都计算字符串中的所有字符。 rtbxContent.TextLength也是如此。
答案 1 :(得分:0)
字符串搜索是线性的。如果您发现Find
方法速度较慢,也许您可以使用第三方工具进行搜索。您所需要的只是字符串中模式的索引。
也许this will help you。你应该把差异计算在一起并使用更快的差异。
答案 2 :(得分:0)
你正走在正确的轨道上,Winforms的慢速RichTextBox实现应该受到责备。您还可以使用BeginUpdate和EndUpdate方法(我猜你从here获取了那些?)。但唉,这还不够。
一些解决方案:
1:尝试将RTF直接写入文本框。这是一个相当混乱,复杂的格式,但幸运的是,我已经创建了一个答案here,可以解决这个问题。
2:这个评价很高的外部项目看起来也值得一看:http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting