0

我正在为我的兄弟构建一个应用程序,该应用程序从外部源 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");
4

1 回答 1

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);
于 2013-07-06T20:04:55.880 回答