我正在为我的兄弟构建一个应用程序,它从字符串输入形成一个外部源,GPS绘图仪,我想在多行文本框中显示。如果有人要让这个应用程序运行一段时间,我不希望超出TextBox.MaxLength或者内存分配过多。
我想不出一个实现这个的好方法。我需要在文本框中显示最后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 :(得分: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);