Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#StringBuilder:检查它是否以新行结束_C#_Stringbuilder - Fatal编程技术网

C#StringBuilder:检查它是否以新行结束

C#StringBuilder:检查它是否以新行结束,c#,stringbuilder,C#,Stringbuilder,我有一个StringBuilder,它可以积累代码。在某些情况下,代码块之间有两行空行,我想将这一行设为空行。 如何检查当前代码末尾是否已有空行?(由于性能问题,我不喜欢使用它的ToString()方法。)您可以通过索引访问StringBuilder中的任何字符,就像使用字符串一样 var sb = new StringBuilder(); sb.Append("Hello world!\n"); Console.WriteLine(sb[sb.Length - 1] == '\n'); //

我有一个
StringBuilder
,它可以积累代码。在某些情况下,代码块之间有两行空行,我想将这一行设为空行。

如何检查当前代码末尾是否已有空行?(由于性能问题,我不喜欢使用它的
ToString()
方法。)

您可以通过索引访问
StringBuilder
中的任何字符,就像使用
字符串一样

var sb = new StringBuilder();
sb.Append("Hello world!\n");
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True

可以使用正则表达式规范化换行:

var test = @"hello

moop

hello";

var regex = new Regex(@"(?:\r\n|[\r\n])+");

var newLinesNormalized = regex.Replace(test, Environment.NewLine);
输出:

hello
moop
hello

下面是完整的示例

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");

    }            
}

因为在代码中间我不关心2个空行,最简单的方法是使用< /P>

myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine);

此选项不需要对使用代码累加器的类进行任何更改

如果有人像我在这里那样在这里结束,那么通常的方法是检查
StringBuilder
的结尾是否有任意字符串,并且必须在其上使用
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;
}
public static bool EndsWith(此StringBuilder草垛,字符串针)
{
var针头长度=针头。长度-1;
var haystackLength=haystack.Length-1;
if(长度<针头长度)
{
返回false;
}
对于(int i=0;i
单行检查。使用字符串类型,而不是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
}

您必须在添加线/块时检查线/块,或者将所有“双新线”替换为一条,并修剪末端。可以使用“替换”并将两条Environment.NewLine的任何引用替换为一条Environment.NewLine(位于建筑末端)。另一种可能是使用ToString(长度-1,1)来获得最终角色。这就是我最终所做的。它被公布为答案,但被删除,因为有人提到,它也将删除双新行在代码中间。这对我来说真的不重要,所以如果这个解决方案将作为答案发布,我会标记它。我说的是巨大的代码块。我试着检查最后的字符,但它变得混乱。为什么它变得混乱?如果您编写了一个接受
StringBuilder
的方法,那么您可以创建一个简洁的小子程序。分而治之。请注意,这适用于Linux和Windows,但不适用于Mac OSX之前的Mac line endings,它以
\r
结尾(但这很容易编程,是的,是史前的)。这将需要对我的代码进行巨大的更改-我希望将更改保持在最低限度。不过,感谢您提供的代码示例。这是一个仅使用代码的示例,无法回答标题中的问题。这与
StringBuilder
有何关系?如果
myCode
不使用
Environment.NewLine
作为行分隔符,这将不起作用。此外,这并没有比
ToString
更有效。即使这似乎适用于您的特定情况,但这并不是对您提出的问题的回答。这当然只适用于平台默认行结尾,这可能有点自以为是。它似乎也不使用
StringBuilder
。@MaartenBodewes平台检测不是一项要求,我在开头一行中确实说过它不使用StringBuilder。在重读原始版本时,我不确定它是否解决了他的问题——他是想检查整个字符串末尾是否有额外的换行符,还是想分析字符串中的每一行并删除双换行符……当然,问题是由特定用户编写的,但它们应该适用于其他用户。如果这只适用于平台编码,那么至少在回答中说明,否则复制代码的每个人都可能遇到问题。该问题明确指出,最好不要使用字符串,但除此之外,如果可以使用字符串,该问题对其他人的用处会小得多;这是一个更容易解决的问题(regex等)。谢谢你再看一眼。可能不止一行结尾,而你的针只接受一根线。