下面是我为RichTextBox
派生类编写的三个方法,它是一个语法高亮。Richtextbox 的当前行有一个共享副本,lcpy_strLine
全部大写。这些方法的作用是;
ColorInsideTwoChars将两个指定字符之间的字符着色为指定颜色。前任。
ColorInsideTwoChar("(", ")", Color.Green)
将为当前行中的所有括号集将两个括号之间的所有字符着色为绿色ColorTilNoNumFromChar颜色,从指定字符开始,所有为数字的字符,例如。
ColorTilNoNumFromChar("G", Color.Red)
遇到 G 后会将所有数字着色为红色(包括 G)如果指定字符后面没有字母,则ColorCharIfNotFollowedByLetter为指定字符着色。前任。
ColorCharIfNotFollowedByLetter("x", Color.Orange)
会将所有 X 后面没有字母的橙色着色
我的问题是,是否有更快的方法来执行这些方法。它们看起来很丑,我认为这些方法肯定有更简单、更美观的方法。有什么建议么?我问是因为这些方法在几千行文件的每一行上运行并且非常慢。我需要加快他们的速度。我可以尝试以不同的方式重写它们中的每一个,或者我可以让一些聪明人尝试引导我朝着正确的方向前进。
private void ColorInsideTwoChars(String car1, String car2, Color clr)
{
int indx1 = 0;
int indx2 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car1, indx1)) != -1
&& (indx2 = lcpy_strLine.IndexOf(car2, indx2)) != -1
&& indx1 < indx2)
{
SelectionStart = m_nLineStart + indx1;
SelectionLength = (indx2 - indx1) + 1;
SelectionColor = clr;
indx1 = ++indx2;
}
}
private void ColorTilNoNumFromChar(String car, Color clr)
{
int indx1 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car, indx1)) != -1)
{
int j = 0;
for (j = indx1 + 1; j < m_nLineLength; j++)
{
if (!Char.IsDigit(lcpy_strLine[j]))
break;
}
SelectionStart = m_nLineStart + indx1;
SelectionLength = j - indx1;
SelectionColor = clr;
indx1 = j;
}
}
private void ColorCharIfNotFollowedByLetter(String car, Color clr)
{
int indx1 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car, indx1)) != -1 &&
indx1 + 1 < m_nLineLength)
{
SelectionStart = m_nLineStart + indx1;
SelectionLength = 1;
if (!Char.IsLetter(lcpy_strLine[lcpy_strLine.IndexOf(car) + 1]))
SelectionColor = clr;
else
SelectionColor = Color.Black;
++indx1;
}
}