タイトル | : Re: QueueCollectionsの改良 |
記事No | : 8338 |
投稿日 | : 2008/10/17(Fri) 22:32 |
投稿者 | : よねKEN |
結論から言うとキューの途中の値を削除したいという要件には、 フレームワークに用意されているQueueクラス及びそれを継承したクラスは 適さないと思います。
どのクラスを継承すると楽かはわかりませんが、内部的にはList(Of T)を使って、 Queueクラスが持っているのと同名のメソッドを実装するとともに コレクションとして実装しておくべきインタフェース(IEnumerableとかその他いろいろ)も実装するのが簡単かなと思います。
Queueクラスを継承しても希望のことを実現できないのは、 Queueクラスのメソッドにはキューの途中のアイテムを削除するメソッドはないからです。 (protected/privateなメンバも含めて)
System.Collections.GenericのQueueのソースは見つからなかったので確認していませんが、 少なくともSystem.CollectionsのQueueクラスでは、内部では配列を循環バッファとして使っており、 原理的に途中の項目を削除できませんので、Generic版のQueueクラスでも同様でしょう。
以下は余談です。 用語の使い方が気になったので細かいですが一応ツッコミ入れておきます。。
> LILOな処理を行いたく、
これはLast In, Last Outの意図ですよね、たぶん。 意味を考えた場合、間違いというわけではないですが、 一般的にはFIFO(First In, First Out)と呼ばれます。 #最初に入ったものが最初に出るでも、最後に入ったものが最後に出るでも、結果は同じですけどね。
> その制御にはSystem.Collections.Generic.Queue(Of String)を > 使うのが便利と考えました。Enqueue,Dequeue,Containsメソッドでおおむね欲しい機能は > 実現できるのですが、唯一下記の処理ができません。 > ・キューの途中にあるItemをキューの先頭に戻す > キューの途中にあるItemをRemoveできれば先頭へのEnqueueでも良いです。
Enqueueでも良いということは実現したいのは"先頭"への追加ではなく "末尾"への追加ですね。
Queueは待ち行列を表現したものなので、 最初に追加したものを先頭、最後に追加したものを末尾と表現します。
|