gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:36:07 25 4
gpt4 key购买 nike

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

但是随着行数增长到 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),这很吃性能。 (如果我错了,请纠正我。)

我决定使用二叉树来存储行号,以提高按字符索引搜索行号时的搜索性能。我想获得一个数据结构,它需要 O(n) 的构造时间、O(nlgn) 的最坏情况更新和 O(lgn) 的搜索时间。

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

最佳答案

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

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

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

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

关于c# - 如何在c#中打印文本框的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com