2013-04-23 67 views
2

好吧,所以我试图在窗体内创建一个类似文本框的“控制台”,但是一旦到达底部,instaid能够向上滚动,就会删除顶线,我有一些困难。 到目前为止,当它到达底部时,它会删除最上面的一行,但只有一次,它只是正常进行。这里是我的功能:从字符串生成器/字符串c中删除第一行#

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

将是巨大的,如果有人能解决这个问题,谢谢

卢卡斯

+2

StringBuilder的是不是这个正确的数据结构。您需要15个字符串的数组,并根据需要移动字符串。一个固定大小的队列也可以工作。 – leppie 2013-04-23 10:33:16

+0

干杯,我不知道为什么我没有想到这一点 – user2294174 2013-04-23 10:36:59

+0

那么唯一的问题,我会与这将是每次我创建一个新的输入,它将不得不写出所有其他先前的线iswell? – user2294174 2013-04-23 10:38:55

回答

1

一个简单的选择:你可以通过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

+0

这似乎没有工作? – user2294174 2013-04-23 10:44:37

+0

@ user2294174:这是一个问题吗?我已经添加了一个演示,所以你可以看到它的工作原理。你必须重新分配返回的字符串。 “字符串”是不可变的,所以你不能修改它们。看我的演示。 – 2013-04-23 11:03:29

3

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

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

首先,这有什么错你的解决方案:它不工作的原因是,它消除了线的内容,但它在最后忽略了\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(在这种情况下不会删除任何内容)),此代码也不会崩溃。

+0

太棒了!谢谢,工作 – user2294174 2013-04-23 12:04:14

+0

@ user2294174不客气!如果这解决了您的问题,请考虑通过点击旁边的复选标记来接受答案。这会让其他人知道你不再寻找改进的解决方案,并为堆栈溢出赢得徽章。 – dasblinkenlight 2013-04-23 12:06:02

1

可以删除此行

var lines = lines.Remove(0, lines.ToString().IndexOf(Environment.NewLine)); 
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, “”