2013-07-06 151 views
0

我正在爲我的兄弟構建一個應用程序,該應用程序需要字符串輸入形式的外部來源,GPS繪圖儀,我想要在多行文本框中顯示。如果有人要讓這個應用程序長時間運行,我不希望TextBox.MaxLength被超過或內存分配變得過度。C#字符串數組緩衝區

我想不出一個很好的實現方法。我需要在文本框中顯示最後n行。


編輯:標記的解決方案是正確的。謝謝喬恩。我結束了它的通用。以下是我用過的。

public class ArrayBuffer<T> 
{ 
    private readonly int _maxLines; 
    private int _writePosition; 

    private readonly T[] _buffer; 

    public ArrayBuffer(int maxLines = 100) 
    { 
     _maxLines = maxLines; 
     _buffer = new T[_maxLines]; 
    } 

    public T[] Push(T value) 
    { 
     _buffer[_writePosition++] = value; 
     _writePosition %= _maxLines; 
     return _buffer.Skip(_writePosition) 
          .Concat(_buffer.Take(_writePosition)) 
          .Where(line => line != null).ToArray(); 
    } 
} 

用法:

var myArrayBuffer = new ArrayBuffer<string>(50); 
string[] bufferedStringArray = myArrayBuffer.Push("some string"); 
+0

也許醒酒第一? –

+0

哈哈。騎馬[鮑爾默峯](http://xkcd.com/323/) – TheGwa

回答

4

假定可接受的解決辦法是將顯示不超過每時間輸出的最後N行越多,能保持輸入的最後N行的循環緩衝器。無論何時輸入,緩衝區中最早的行會被刪除,以便爲新到達者騰出空間。

實現緩衝的部分:

const int MAX_LINES = 10; 
int writePosition = 0; 
readonly string[] buffer = new string[MAX_LINES]; 

當新輸入到達:

// input is an IEnumerable<string> 
foreach (var line in input) 
{ 
    buffer[writePosition++] = line; 
    writePosition %= MAX_LINES; 
} 

當你想顯示輸出:

var linesInDisplayOrder = buffer.Skip(writePosition) 
           .Concat(buffer.Take(writePosition)) 
           .Where(line => line != null); 
var outputText = String.Join("\n", linesInDisplayOrder); 
+0

給你的好幫手先生。這是一個非常狡猾的解決方案。 – TheGwa