如何替换 stringbuilder

问题描述

既然有一种方法可以将行附加到字符串构建器对象(使用 AppendLine()),那么是否有任何直接的方法来查找特定行而无需硬编码换行符 \n

所以基本上我想替换我使用 AppendLine 方法添加行的字符串构建器对象的最后一行文本。

有什么办法吗? 我发现有一些方法可以使用 \n 而不是 string builder

找到字符串中的最后一行

解决方法

我认为更有用的扩展是返回 StringBuilder 作为结果。

因此,如果您想了解有关 StringBuilder 的信息,请参阅 code

public static class StringBuilderExt
{
    public static StringBuilder RemoveLastLine(this StringBuilder sb)
    {
        for (int i = sb.Length - 1; i >= 0; i--)
        {
            if (Environment.NewLine.Contains(sb[i]))
            {
                sb.Remove(i,sb.Length - i);
                return sb;
            }
        }
        return sb;
    }
}

并且您可以使用此扩展程序,无需破坏构建器模式:

class Program
{
    static void Main(string[] args)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("First line")
            .AppendLine("Second line")
            .AppendLine("Last line");
        Console.WriteLine(sb);

        sb.RemoveLastLine().AppendLine("Line after delete last line");

        Console.WriteLine(sb);
    }

}

你会看到结果:

First line
Second line
Last line

First line
Second line
Line after delete last line
,

您可以编写一个扩展方法,让您在 StringBuilder 中找到给定字符的最后一个索引:

public static class StringBuilderExtensions
{
    public static int LastIndexOf(this StringBuilder sb,char character)
    {
        for(int i = sb.Length - 1; i >= 0; i--)
        {
            if(sb[i] == character)
            {
                return i;
            }
        }
        return -1;
    }
}

现在您可以删除最后一个字符(刚添加一行时为 \n),然后搜索最后一个 \n 并从那里删除所有内容。之后,您可以添加任何导致替换最后一行的新行:

sb.Remove(sb.Length - 1,1);
int index = sb.LastIndexOf('\n') + 1;
sb.Remove(index,sb.Length - index);
sb.AppendLine("new content");

当然,你也可以把这段代码放到ReplaceLastLine这样的扩展方法中。在线演示:https://dotnetfiddle.net/0dVyej