如何在c#中打印文本框的行号

这将是一个很长的post。 如果有任何关于我遵循的程序,我想提出建议。 我想要最好的方法在richtextbox中的每个CRLF终止行旁边打印行号。 我正在使用C#和.NET。 我尝试过使用ListView,但是当行数增加时效率很低。 我已经成功地在自定义控件中使用Graphics来打印行号,到目前为止我对性能感到满意。

但随着行数增加到50K到100K,滚动受到严重影响。 我已经覆盖了WndProc方法并处理所有消息,仅在需要时调用行号打印。 (重写OnContentsResized和OnVScroll会对打印方法进行冗余调用)。

现在行号打印很好,当行数小到高达10K(我很好,因为它很少需要编辑10000行的文件)但我想删除限制。

几点观察

  • richtexbox中显示的行数是常量+ -1。 因此,性能差异应归因于大文本,而不是因为我使用的是图形绘画。
  • 与小文件相比,大文本的绘制行号较慢

现在的伪代码

FIRST_LINE_NUMBER = _textBox.GetFirstVisibleLineNumber(); LAST_LINE_NUMBER = _textBox.GetLastVisibleLineNUmber(); for(loop_from_first_to_last_line_number) { Y = _textBox.GetYPositionOfLineNumber(current_line_number); graphics_paint_line_number(current_line_number, Y); } 

我正在使用GetCharIndexFromPosition并遍历RichTextBox.Lines以查找获取行号的两个函数中的行号。 要获得Y位置,我使用GetPositionFromCharIndex来获取Point结构。

所有上述RichTextBox方法似乎都是O(n),这会降低性能。 (如果我错了,请纠正我。)

我决定使用二叉树来存储行号,以便在通过char索引搜索行号时提高搜索性能。 我想到了一个数据结构,它需要O(n)构造时间,O(nlgn)最坏情况更新和O(lgn)搜索。

这种方法值得付出努力吗? 有没有其他方法可以解决这个问题? 如果需要,我准备从头开始编写控件,我只是希望它重量轻,速度快。

在决定最佳前进方向之前,我们需要确保了解瓶颈。

首先,了解RichTextbox(我假设您正在使用它如何处理)处理大文件非常重要。 所以我建议删除所有行打印的内容,看看它是如何用大文本执行的。 如果它很差,那就有你的问题。

第二步是放置一些分析陈述或只使用分析器(一个与VS 2010一起)来找到瓶颈。 它可能会成为查找行号或其他内容的方法。

在这一点上,我只会建议更多的调查 。 如果您已完成调查并获得更多信息,请更新您的问题,我会相应地回复您。