我有一个StringBuilder
用于累积代码。在某些情况下,代码块之间会有2个空行,我想把它们变成1个空行。
如何检查当前代码是否已经以空行结尾?(我不想使用 ToString()
方法,因为会影响性能。)
我有一个StringBuilder
用于累积代码。在某些情况下,代码块之间会有2个空行,我想把它们变成1个空行。
如何检查当前代码是否已经以空行结尾?(我不想使用 ToString()
方法,因为会影响性能。)
您可以通过索引访问StringBuilder
中的任何字符,就像您处理String
一样。
var sb = new StringBuilder();
sb.Append("Hello world!\n");
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True
StringBuilder
的方法,那么你可以创建一个整洁的小子程序。分而治之。请注意,这适用于 Linux 和 Windows,但不适用于 Mac OSX 之前的 Mac 行尾,其以 \r
结尾(但这很容易编程,是史前时期的事情)。 - Maarten Bodewes我得到了一个“有趣”的答案:
var sb = new StringBuilder();
sb.AppendLine("test");
sb.AppendLine("test2");
Console.WriteLine(sb.ToString().TrimEnd('\n').Length != sb.ToString().Length); //true
您可以使用正则表达式来规范化换行符:
var test = @"hello
moop
hello";
var regex = new Regex(@"(?:\r\n|[\r\n])+");
var newLinesNormalized = regex.Replace(test, Environment.NewLine);
输出:
hello
moop
hello
StringBuilder
有什么关系? - Clément单行检查。使用字符串类型,而不是StringBuilder,但您应该了解基本思路。
if (theString.Substring(theString.Length - Environment.NewLine.Length, Environment.NewLine.Length).Contains(Environment.NewLine))
{
//theString does end with a NewLine
}
else
{
//theString does NOT end with a NewLine
}
StringBuilder
。 - Maarten Bodewes这是完整的示例。
class string_builder
{
string previousvalue = null;
StringBuilder sB;
public string_builder()
{
sB = new StringBuilder();
}
public void AppendToStringBuilder(string new_val)
{
if (previousvalue.EndsWith("\n") && !String.IsNullOrEmpty(previousvalue) )
{
sB.Append(new_val);
}
else
{
sB.AppendLine(new_val);
}
previousvalue = new_val;
}
}
class Program
{
public static void Main(string[] args)
{
string_builder sb = new string_builder();
sb.AppendToStringBuilder("this is line1\n");
sb.AppendToStringBuilder("this is line2");
sb.AppendToStringBuilder("\nthis is line3\n");
}
}
既然我不在乎代码中间的两行空白,最简单的方法就是使用
myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine);
这个选项不需要对使用代码累加器的类进行任何更改。
myCode
没有使用Environment.NewLine
作为行分隔符,那么这种方法是行不通的。此外,这种方法并不比ToString
更有效率。 - ClémentStringBuilder
的结尾是否为任意字符串,而不必在其上使用 ToString
。public static bool EndsWith(this StringBuilder haystack, string needle)
{
var needleLength = needle.Length - 1;
var haystackLength = haystack.Length - 1;
if (haystackLength < needleLength)
{
return false;
}
for (int i = 0; i < needleLength; i++)
{
if (haystack[haystackLength - i] != needle[needleLength - i])
{
return false;
}
}
return true;
}