问题描述
既然有一种方法可以将行附加到字符串构建器对象(使用 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