我正在使用C#编写文本编辑器,我知道我只是重新发明轮子,但这是一种学习经历和我想做的事情。
现在我有一个基本的文本文档使用类似于Gap Buffer的东西但是我必须更新我的行缓冲区,以便每次对缓冲区进行编辑时保持每行的开头。
我正在考虑创建另一个文本文档,以便使用行列表进行测试并改为编辑每一行。
现在我的问题是使用LinkedList与标准List会有什么好处?
答案 0 :(得分:5)
链接的行列表将快速插入新行或删除行,并快速向下移动(如果您有双向链接列表,则向上移动)来自特定行的少量行,并快速到移到文档的开头。要快速移动到文档的末尾,您还需要存储链接列表的末尾。然而,去一个特定的行号是相对较慢的,因为你必须从头开始并遍历这些行,尽管这不应该是一个问题,除非你的文档有很多行。
普通列表可以快速移动到特定的行号,但添加或删除任何行的速度都很慢,因为每次插入或删除行时都需要复制整个缓冲区。
我更喜欢基于数组的列表上的链表,以便编辑大型文档。在任何一种情况下,如果文档包含任何非常长的行,因为字符串是不可变的并且更改每个字符将会很慢,则可能会出现问题。
答案 1 :(得分:1)
我每行使用一个字符串数组。数组通常更快或等于更新链接列表,因为它们具有比链接列表更好的缓存局部性,并且对于单个第一级缓存未命中,您可以移动数组中的几十个指针项。我会说,对于一切不到10000个项目只使用一个指针数组。
如果你编辑的文字很小(比如手写的源代码文件),那就是你要走的路。您对最先进的文本编辑所需的大量元信息可以很好地分为“行首”点。最重要的是语法高亮。
还有错误行,断点,分析信息,代码覆盖率标记,所有这些都在一条线上工作。它是源代码文本的原生结构,在相同的情况下也适用于文献文本(如果您编写文本处理器而不是源代码编辑器),但在这种情况下,您需要将段落作为一个单元。
如果我找到时间重新设计我的编辑器,我将添加不同的缓冲区实现,因为在较大的文本上,所有行信息数据(在32位系统上每行大约80字节)的开销很大。然后一个间隙缓冲模型更好,如果你没有行,例如在十六进制模式下显示二进制文件时,它也会好得多。
最后,当您允许用户打开大文件时,需要第三个缓冲区模型。有趣的是看到营销废话(免费开源在这里出乎意料地更糟)关于无限制的文件大小编辑,一旦你打开一个400 MB的日志文件,整个系统就会没有反应。这里需要一个缓冲模型,它不会先将整个文件加载到缓冲区中。