从字符串构建器/字符串c#中删除第一行

时间:2013-04-23 10:31:04

标签: c# stringbuilder

好的,所以我试图在表单中创建一个像文本框一样的“控制台”,但是一旦你到达底部,可以向上滚动,它只会删除顶线,我有一些困难。 到目前为止,当它达到最低点时,它会删除顶线,但只有一次,它只是正常运行。这是我的功能:

   StringBuilder sr = new StringBuilder();
    public void writeLine(string input)
    {
        string firstline = "";
        int numLines = Convert.ToString(sr).Split('\n').Length;
        if (numLines > 15)      //Max Lines
        {                
            sr.Remove(0, Convert.ToString(sr).Split('\n').FirstOrDefault().Length);              
        }
        sr.Append(input + "\r\n");
        consoleTxtBox.Text = Convert.ToString(sr) + numLines;
    }

如果有人能解决这个问题会很棒,谢谢

卢卡斯

6 个答案:

答案 0 :(得分:8)

首先,您的解决方案出了什么问题:它不起作用的原因是它删除了行的内容,但它最后忽略了\n。添加1应该可以解决这个问题:

sr.Remove(0, Convert.ToString(sr).Split('\n').FirstOrDefault().Length+1);              
//                                                                    ^
//                                                                    |
//   This will take care of the trailing '\n' after the first line ---+

现在以更简单的方式做到这一点:您需要做的就是找到第一个\n,并在它之后获取子串,如下所示:

string RemoveFirstLine(string s) {
    return s.Substring(s.IndexOf(Environment.NewLine)+1);
}

请注意,即使字符串中没有换行符,即IndexOf返回-1时,此代码也不会崩溃(在这种情况下,不会删除任何内容)。

答案 1 :(得分:3)

您可以使用TextBox中的Lines属性。这将获取TextBox中的所有行,作为数组,然后创建一个不包含第一个元素(Skip(1))的新数组。它将这个新数组分配回文本框。

string[] lines = textBox.Lines;
textBox.Lines = lines.Skip(1).ToArray();

答案 2 :(得分:2)

一个简单的替代方法:您可以将字符串拆分为Environment.NewLine并返回除第一个之外的所有字符串:

public static string RemoveFirstLine(string input)
{
    var lines = input.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
    return string.Join(Environment.NewLine, lines.Skip(1));
}

Demo

答案 3 :(得分:2)

你可以删除这一行

 var lines = lines.Remove(0, lines.ToString().IndexOf(Environment.NewLine));

答案 4 :(得分:0)

大多数解决方案似乎没有考虑到Enviroment.NewLine可以包含多个字符(len> 1)这一事实。

    public void RemoveFirstStringFromStringBuilder()
    {
        var lines = new StringBuilder();

        lines.AppendLine("abc");

        var firstLine = lines.ToString().IndexOf(Environment.NewLine, StringComparison.Ordinal);

        if (firstLine >= 0)
            lines.Remove(0, firstLine + Environment.NewLine.Length);

        Console.WriteLine(lines.Length);
        Console.WriteLine(lines.ToString());
    }

打印出:0和“”

答案 5 :(得分:0)

对我有用的是:

    var strBuilder = new StringBuilder();
    strBuilder.AppendLine("ABC");
    strBuilder.AppendLine("54");
    strBuilder.AppendLine("04");

    strBuilder.Remove(0, strBuilder.ToString().IndexOf(Environment.NewLine) + 2);

    Console.WriteLine(strBuilder);

+1的解决方案对我不起作用,可能是因为在这种情况下EOF被解释为2个字符(\ r \ n)