Peekがキュー内の次のオブジェクトを返す場合、特定のオブジェクトを取得するために使用できるメソッドはありますか?たとえば、キュー内の3番目のオブジェクトを見つけて、その値の1つを変更したいですか?
今のところ、私はキューを介してforeachを実行しているだけですが、これが最善の解決策かもしれませんが、peekで使用できる特別なものがあるかどうかわかりませんでしたか?つまり、Queue.Peek(2)
要素に直接(操作を使用して)アクセスする場合O(1)
は、キューの機能(FIFO)が異なるため、キューの代わりに配列を使用してください。
キューでのランダムアクセス操作O(n)
は、コレクション内のすべての要素を反復処理する必要があるためです。これにより、直接ランダムアクセスではなく、シーケンシャルアクセスになります。
繰り返しになりますが、C#を使用しているので、 queue.ElementAt(n)
fromを使用できますSystem.Linq
(Queue
implements以降IEnumerable
)が、それはそうではありません。O(1)
つまり、要素を反復処理します。
これはまだO(n)ですが、LINQ拡張メソッドElementAt()
またはを使用すると、確かに読みやすくなります。ElementAtOrDefault()
これらはIEnumerable<T>
、をQueue<T>
実装するの拡張です。
using System.Linq;
Queue<T> queue = new Queue<T>();
T result;
result = queue.ElementAt(2);
result = queue.ElementAtOrDefault(2);
編集 この操作のためだけにキューを配列に変換する他の提案を行う場合は、キューの可能性のあるサイズと、キューの先頭から探しているインデックスの距離を決定する必要があります.ToArray()を呼び出すO(n)操作を正当化します。ElementAt(m)は、セカンダリストレージの場所を作成するためのスペース要件は言うまでもありません。
キューを介してforeach。一種のパラドックス。
ただし、foreachが可能な場合、それはIEnumerableであるため、通常のlinq拡張機能が適用されます。
queue.Skip(1).FirstOrDefault()
また
queue.ElementAt(1)
このようなことを1回限りで行うことができます。
object thirdObjectInQueue = queue.ToArray()[2];
ただし、キュー全体を配列にコピーし、それによってキュー全体を反復処理するため、あまり使用することはお勧めしません。