我正在开发一个自定义文本编辑器控件,并遇到了这个问题。
我需要一个函数,可以获取文本中每个换行符“\n”的字符索引。我已经有两种方法可以实现这个功能:
private List<int> GetNewLineLocations()
{
var list = new List<int>();
int ix = 0;
foreach (var c in this.Text)
{
if (c == '\n') list.Add(ix);
ix++;
}
Debug.WriteLine(ix);
return list;
}
同时:
private List<int> GetNewLineLocations()
{
var list = new List<int>();
int ix = -1;
for (int i = 0; i < this.Lines.Length; i++)
{
ix += Lines[i].Length;
ix += 1;
list.Add(ix);
}
return list;
}
第一个解决方案确实可以工作,但输入到richTextBox中的文本越多,它就会变得越慢。大约40000个字符可以分散在很多行中,例如20000行。
第二个方案似乎更快,因为它循环较少并且大致相同,但无论这些行包含多少文本,它都会急剧减速到1000行左右。
当然,代码需要运行得快,并且不使用太多资源,这就是我认为第二个解决方案更好的原因。
我的问题是:
1.哪种解决方案更好?为什么?
2.为什么第二个解决方案如此缓慢?
3.有没有更好的解决方案?
\n
字符并存储索引。您已经拥有行的集合TextBoxBase.Lines,而TextBoxBase.GetFirstCharIndexFromLine
将返回特定行中每个起始字符的索引。仅在真正需要时使用提供的索引器:int CharIndex = richTextBox1.GetFirstCharIndexFromLine(100);
- Jimirtb.SelectionStart
、rtb.GetLineFromCharIndex(...)
和rtb.GetFirstCharIndexFromLine(...)
。一旦你得到了这个,你就可以处理rtb.Lines[...]
中的单行内容。 - Nyerguds