【问题标题】:How to print line numbers for textbox in c#如何在c#中打印文本框的行号
【发布时间】:2010-10-06 11:27:06
【问题描述】:

这将是一个很长的帖子。如果对我正在遵循的程序有任何建议,我想提出建议。我想要最好的方法来打印富文本框中每个 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) 搜索的数据结构。

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

【问题讨论】:

    标签: c# .net optimization richtextbox


    【解决方案1】:

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

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

    第二步是放置一些分析语句或仅使用分析器(VS 2010 附带)来查找瓶颈。它可能是查找行号的方法,或其他。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多