首页 > 解决方案 > 在richtextbox中查找所有换行符

问题描述

我正在开发一个自定义文本编辑器控件并遇到了这个问题。

我需要一个函数来获取文本中每个换行符“\n”的字符索引。我已经有两种方法来完成这个:

private List<int> GetNewLineLocations()
    {
        var list = new List<int>();
        int ix = 0;
        foreach (var c in this.Text)
        {
            if (c == '\n') list.Add(ix);
            ix++;
        }
        Debug.WriteLine(ix);
        return list;
    }

和:

private List<int> GetNewLineLocations()
    {
        var list = new List<int>();
        int ix = -1;

        for (int i = 0; i < this.Lines.Length; i++)
        {
            ix += Lines[i].Length;
            ix += 1;
            list.Add(ix);
        }

        return list;
    }

第一个解决方案确实有效,但是在大约 40000 个字符的 Richtextbox 中输入的文本越多,但它可以分布在很多行中,比如 20000 行,就会减慢速度。

第二个似乎更快,因为它循环更少,并且或多或少相同,但在 1000 行时显着减慢,无论它们包含多少文本。

代码当然需要快速运行并且不使用大量资源,这就是为什么我认为第二种解决方案会更好。

我的问题是:

  1. 哪种解决方案更好,为什么?

  2. 为什么第二个解决方案这么慢?

  3. 有没有更好的解决方案?

标签: c#.netwinformsrichtextbox

解决方案


我使用富文本框和 40k 行尝试了您的示例和 Felix 的示例以及我自己的解决方案。结果是这是最快的,而且我没有看到减速。您可以尝试将行数组作为参数传递并让我们知道结果吗?

public static List<int> GetNewLineLocations(this string[] lines)
        {
            var list = new List<int>();
            int ix = -1;

            for (int i = 0; i < lines.Length; i++)
            {
                ix += lines[i].Length+1;
                list.Add(ix);
            }

            return list;
        }

推荐阅读