Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本编辑链接列表与行列表_C#_.net_List_Text_Editor - Fatal编程技术网

C# 文本编辑链接列表与行列表

C# 文本编辑链接列表与行列表,c#,.net,list,text,editor,C#,.net,List,Text,Editor,我正在用C#编写一个文本编辑器,我知道我只是在重新发明轮子,但这是一种学习经历,也是我想做的事情 现在,我有一个基本的文本文档,它使用的东西类似于间隙缓冲区,但是每次对缓冲区进行编辑时,我必须更新我的行缓冲区以保留每行的开头 我正在考虑使用行列表创建另一个文本文档进行测试,并编辑每一行 现在我的问题是,使用链接列表与标准列表相比,有什么好处?行的链接列表可以快速插入新行或删除行,可以快速从特定行向下移动(如果有双链接列表,则可以向上移动)少量行,也可以快速移动到文档的开头。要快速移动到文档末尾,

我正在用C#编写一个文本编辑器,我知道我只是在重新发明轮子,但这是一种学习经历,也是我想做的事情

现在,我有一个基本的文本文档,它使用的东西类似于间隙缓冲区,但是每次对缓冲区进行编辑时,我必须更新我的行缓冲区以保留每行的开头

我正在考虑使用行列表创建另一个文本文档进行测试,并编辑每一行


现在我的问题是,使用链接列表与标准列表相比,有什么好处?

行的链接列表可以快速插入新行或删除行,可以快速从特定行向下移动(如果有双链接列表,则可以向上移动)少量行,也可以快速移动到文档的开头。要快速移动到文档末尾,还需要存储链接列表的末尾。但是,转到特定行号的速度相对较慢,因为您必须从头开始并迭代行,尽管这应该不会是一个问题,除非您的文档有很多行

普通列表移动到特定行号的速度很快,但添加或删除任何行(末尾除外)的速度很慢,因为每次插入或删除行时都需要复制整个缓冲区


为了编辑大型文档,我更喜欢链表而不是基于数组的列表。在任何一种情况下,如果文档包含任何非常长的行,则可能会出现问题,因为字符串是不可变的,更改每个字符的速度都会很慢。

行的链接列表可以快速插入新行或删除行,并且可以快速从特定行向下移动(如果有双链接列表,则可以快速向上移动)少量行,快速移动到文档的开头。要快速移动到文档末尾,还需要存储链接列表的末尾。但是,转到特定行号的速度相对较慢,因为您必须从头开始并迭代行,尽管这应该不会是一个问题,除非您的文档有很多行

普通列表移动到特定行号的速度很快,但添加或删除任何行(末尾除外)的速度很慢,因为每次插入或删除行时都需要复制整个缓冲区


为了编辑大型文档,我更喜欢链表而不是基于数组的列表。在任何一种情况下,如果文档包含任何非常长的行,则可能会出现问题,因为字符串是不可变的,更改每个字符的速度都会很慢。

我使用的是每行一个字符串的数组。数组的更新速度通常比链表快,因为它们的缓存位置比链表好得多,对于单个一级缓存未命中,可以在一个数组中移动几十个指针项。我想说,对于少于10000项的所有内容,只需使用一个指针数组

如果您编辑的文本很小(如手写的源代码文件),这是一种方法。最先进的文本编辑所需的许多元信息可以很好地拆分为“行的开头”点。最重要的是语法突出显示

还有错误行、断点、分析信息、代码覆盖率标记,它们都在一行上工作。它是源代码文本的本机结构,在同样的情况下也适用于文学文本(如果您编写的是文本处理器而不是源代码编辑器),但在这种情况下,您需要将段落作为一个单元

如果我有时间重新设计我的编辑器,我会添加不同的缓冲区实现,因为在较大的文本上,所有行信息数据的开销(在32位系统中,每行大约80字节)是非常大的。然后,间隙缓冲区模型更好,如果您根本没有行(例如在十六进制模式下显示二进制文件时),它也会更好


最后,当您允许用户打开大文件时,需要第三个缓冲区模型。有趣的是,看到关于无限制文件大小编辑的营销废话(这里的免费开源更糟糕),一旦你打开一个400 MB的日志文件,整个系统就会毫无反应。这里需要一个缓冲区模型,它不是首先将整个文件加载到缓冲区。

我使用的是每行一个字符串的数组。数组的更新速度通常比链表快,因为它们的缓存位置比链表好得多,对于单个一级缓存未命中,可以在一个数组中移动几十个指针项。我想说,对于少于10000项的所有内容,只需使用一个指针数组

如果您编辑的文本很小(如手写的源代码文件),这是一种方法。最先进的文本编辑所需的许多元信息可以很好地拆分为“行的开头”点。最重要的是语法突出显示

还有错误行、断点、分析信息、代码覆盖率标记,它们都在一行上工作。它是源代码文本的本机结构,在同样的情况下也适用于文学文本(如果您编写的是文本处理器而不是源代码编辑器),但在这种情况下,您需要将段落作为一个单元

如果我有时间重新设计我的编辑器,我会添加不同的缓冲区实现,因为在较大的文本上,所有行信息数据的开销(在32位系统中,每行大约80字节)是非常大的。然后,间隙缓冲区模型更好,如果您根本没有行(例如在十六进制模式下显示二进制文件时),它也会更好

最后,当您允许用户打开大文件时,需要第三个缓冲区模型。有趣的是,看到关于无限制文件大小编辑的营销废话(这里的免费开源更糟糕),一旦你打开一个400 MB的日志文件,整个系统就会毫无反应。这里需要一个缓冲区模型,它不会首先将整个文件加载到缓冲区。

根据标准lis