3

好的,所以我试图在表单中创建一个类似于文本框的“控制台”,但是一旦你到达底部,而不是能够向上滚动,它只会删除顶行,我遇到了一些困难。到目前为止,当它到达底部时,它会删除顶行,但只有一次,它只是照常进行。这是我的功能:

   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;
    }

如果有人能解决这个问题就太好了,谢谢

卢卡斯

4

6 回答 6

11

首先,您的解决方案有什么问题:它不起作用的原因是它删除了该行的内容,但它忽略了\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(在这种情况下不会删除任何内容),此代码也不会崩溃。

于 2013-04-23T10:37:02.307 回答
3

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

string[] lines = textBox.Lines;
textBox.Lines = lines.Skip(1).ToArray();
于 2013-04-23T10:35:49.970 回答
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));
}

演示

于 2013-04-23T10:34:37.330 回答
2

你可以删除这一行

 var lines = lines.Remove(0, lines.ToString().IndexOf(Environment.NewLine));
于 2013-04-23T10:37:02.547 回答
1

大多数解决方案似乎没有考虑到 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 和 ""

于 2016-04-19T06:54:17.777 回答
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)

于 2020-07-09T13:26:20.750 回答