C#字符串数组缓冲区

时间:2013-07-06 19:54:01

标签: c# arrays textbox buffer

我正在为我的兄弟构建一个应用程序,它从字符串输入形成一个外部源,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");

1 个答案:

答案 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);