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

时间:2010-10-06 11:27:07

标签: c# .net optimization richtextbox

这将是一个很长的帖子。如果有任何关于我正在遵循的程序,我想提出建议。我想要最好的方法在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)搜索。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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