4

価値観の短い履歴を保持する必要があります。そのため、最大アイテム数のリストが必要です。そして、いっぱいになっても新しい追加を受け入れてほしいです。その場合、追加した最も古いアイテムを失ってもらいたいです。この目的に合ったクラスは見つかりませんでした。後でメソッドを追加することは確かですが、今のところ必要なものがあります。

だからあなたへの私の最初の質問は:それは正しいコードですか:http://pastebin.com/0BCbyNqJ そのクラスはあなたにとって十分きれいに見えますか?

そして私の2番目の質問は、私が投げているこれらの例外についてです。

/// <summary>
/// Oldest item added to the list
/// </summary>
public T First
{
    get
    {
        if (_head < 0)
            throw new IndexOutOfRangeException("The list is empty");

        if (_firstRoundDone)
            return _array[(_head + 1) % _max];
        else
            return _array[0];
    }
}

Firstリストに何かを追加する前に、Lastを呼び出してCountnullを返したいと思います。それはもっと理にかなっていると思います。しかし、戻り値の型はintまたはTであり、のような制約を追加したくないので、その方法がわかりませんwhere T:Nullable。解決策が見当たらないので、結局のところ、例外が最もエレガントな方法ではないかと思います。または、またはのようなメソッドを実装する必要がGetFirst(out T first)ありTryGetFirst(out T)ますか?

4

4 に答える 4

14

拡張Queue<>すると、次のような非常に短いコードが生成されます。

public class Buffer<T> : Queue<T>
{
    private int? maxCapacity { get; set; }

    public Buffer() { maxCapacity = null; }
    public Buffer(int capacity) { maxCapacity = capacity; }

    public void Add(T newElement)
    {
        if (this.Count == (maxCapacity ?? -1)) this.Dequeue(); // no limit if maxCapacity = null
        this.Enqueue(newElement);
    }
}

.Clear()継承さ.ToList()れるので、実装する必要はありません。

于 2012-09-06T07:14:29.753 に答える
2

http://code.google.com/p/csharp-lru-cache/などの公開されているLRUキャッシュを検討してください。

于 2012-09-06T06:42:56.450 に答える
2

私が間違っている場合は訂正してください。ただし、必要なのはキューであるかのように聞こえます。ただし、これは.Netですでに提供されています。あなたはおそらくそれとそれが提供する方法を使うべきです。

于 2012-09-06T06:44:57.323 に答える
1

必要なのはオーバーフローを可能にする循環バッファだと思います。このような実装はここにあります

于 2012-09-06T06:50:40.213 に答える