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 に答える