c# - 在richtextbox中查找所有换行符
问题描述
我正在开发一个自定义文本编辑器控件并遇到了这个问题。
我需要一个函数来获取文本中每个换行符“\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 行时显着减慢,无论它们包含多少文本。
代码当然需要快速运行并且不使用大量资源,这就是为什么我认为第二种解决方案会更好。
我的问题是:
哪种解决方案更好,为什么?
为什么第二个解决方案这么慢?
有没有更好的解决方案?
解决方案
我使用富文本框和 40k 行尝试了您的示例和 Felix 的示例以及我自己的解决方案。结果是这是最快的,而且我没有看到减速。您可以尝试将行数组作为参数传递并让我们知道结果吗?
public static List<int> GetNewLineLocations(this string[] lines)
{
var list = new List<int>();
int ix = -1;
for (int i = 0; i < lines.Length; i++)
{
ix += lines[i].Length+1;
list.Add(ix);
}
return list;
}
推荐阅读
- swift - 使用 NSLayoutConstraints 初始化器与 Anchors 设置约束的区别
- python - 使用 pandas 读取 CSV 日期会返回 datetime 而不是 Timestamp
- python - 木星上的 Python 目录消失了
- assembly - 崩溃,因为 DIV 指令 ISA: x86-16bit
- c++ - 检查索引是否超出范围以满足 if 条件
- .net - 在 docker 中构建 .net 应用程序,无需额外的复制步骤
- google-chrome - 是否可以始终打开 Chrome Devtools 的“选择要检查的元素”按钮?
- html - 如何以编程方式重置或取消选中 Angular 中的单选按钮?
- clojurescript - 无法在 clojurescript 中使用异步函数
- winapi - 获取驻留在 SMB 挂载上的文件的属性时性能下降