2013-04-23 68 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, 「」