2009-06-01 3 views
1

FIFOを使用できるコレクションオブジェクト/ストラテジーを探しています。コレクション内のアイテムの位置を指定するだけで表示できます。明確にする:FIFOのベストコレクションオブジェクトと位置別アイテムの表示

  1. 私は100個のDTOオブジェクトを言う保持するために、このデータ構造をしたいと思い、それが101に到達したときに、私は最初の項目など(FIFO)を削除することによって、部屋を作ることができます。

  2. 私はこれらのオブジェクトの最新のx個を要求されたときに返すことができます。

.Netキューオブジェクトを使用しようとしましたが、#2をサポートしていないとは限りませんが、何かを見落としている可能性があります。

答えて

2

リストをラップして、キューからアイテムをポップするときにRemoveAt(0)を実行するのは難しくありません。それはあなたにFIFOを与え、どこでもあなたが望むインデックスをつけることができます。おそらくキューの完全性を保護するためにそれをラップするべきです(FIFOのみ)。

+1

リストへのインデックス付けはO(N)操作なので、リストはラップしません。 OPがキューに頻繁にインデックスを作成したいと思うように聞こえるので、それは大きな問題です。 配列はO(1)に任意のアクセス時間を与えます。 – arke

+0

リストのような.NET内のリストクラスは内部的に配列を使用しますが、アイテム#0を削除するのはそれらのO(N)操作なのでオーバーヘッドは同じで、同じ場所にはありません。 –

+0

ああ、私はLinkedListを考えていました。その場合、ラッパー・コレクション・クラスで読み取り索引と書き込み索引を使用すると、OPが気にするすべての操作でO(1)になります。 – arke

1

私は.NETのドキュメントをすばやく見て、必要なときにそれを実現するものは何も見つかりませんでした。あなたがそれを自分で実装する必要があるように見えますが、あまり難しくありません。適切なサイズの配列を使用し、配列の現在位置のインデックスを読み書きして、循環配列として使用することをお勧めします。

エンキューは、値をreadIndexに書き込み、次にreadIndexを(readIndex + 1)%queueSizeに設定します。デキューは、readIndex == writeIndexの場合は例外をスローし、それ以外の場合はwriteIndexで値を取得し、writeIndexを(writeIndex + 1)%queueSizeでインクリメントします。 (キューの先頭から、最後にキューに入れられたアイテムである)キューインデックスを調べると、((queueSize +(readIndex-index))%queueSize)にアイテムが返されます。

関連する問題