【发布时间】:2018-10-11 10:45:33
【问题描述】:
我正在开发一个自定义文本编辑器控件并遇到了这个问题。
我需要一个函数来获取文本中每个换行符“\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;
}
第一个解决方案确实有效,但在大约 40000 个字符的 Richtextbox 中输入的文本越多,速度越慢,但可以分布在很多行中,例如 20000 个。
第二个似乎更快,因为它循环更少,并且或多或少相同,但在 1000 行时显着减慢,无论它们包含多少文本。
代码当然需要快速运行并且不占用大量资源,这就是为什么我认为第二种解决方案会更好。
我的问题是:
哪种解决方案更好,为什么?
为什么第二种解决方案这么慢?
还有更好的解决方案吗?
【问题讨论】:
-
不幸的是我无法让它工作。
-
至少不会更好更快
-
您不需要解析
\n字符和存储索引。您已经拥有行集合 TextBoxBase.Lines 和TextBoxBase.GetFirstCharIndexFromLine将返回特定行中每个起始字符的索引。仅在真正需要时使用提供的索引器:int CharIndex = richTextBox1.GetFirstCharIndexFromLine(100); -
我实际上已经做了一个这样的编辑器,我总是使用辅助函数来获取当前行号和该行的位置,通过使用
rtb.SelectionStart、rtb.GetLineFromCharIndex(...)和@987654330 @。一旦你得到了,你就可以处理来自rtb.Lines[...]的单行。
标签: c# .net winforms richtextbox