2009-10-30 13 views
7

C#ではキューコレクションを使用します。私は簡単にエンキューまたはデキューできます。さて、私はキューの途中またはキューの始めに何かを挿入したいと思います。私はそのようなことをする方法を見つけることはありません。代替コレクションとして何をお勧めしますか?C#のキューに要素を挿入する方法

+4

...私に言ってもらえませんか?あなたは、スーパーマーケットで真ん中に列を入れようとしている人の一人ですか? :)私のポイントは、キューの全体のポイントは、アイテムが一方の端にそれを入力し、別の端に残すことです。ここでは、キューから出て行く人々がどのように実装できるかを理解するために、読者のためのエクササイズとして残しておきます:) –

答えて

26

キューは、定義によって、キューに格納されているものとキューから取り出されたものだけです。真ん中に挿入する場合は、Queueではなく、本格的なリスト(おそらくLinkedList<T>)が必要です。

つまり、あなたはスーパーマーケットの待ち行列の真ん中に自分自身を挿入しようとしません(私が望む)。ここでも同じように動作します。

1

おそらくリストを使用する必要があります。

15

あなたが探しているものはLinkedList<T>です。最初、中間(AddBeforeまたはAddAfterを使用)、またはリストの末尾に追加することができます。

これは、List<T>を使用した場合よりも優れています。これは、RemoveFirstまたはRemoveLastを使用してキューまたはスタックをより正確に模倣できるためです。

2

キューのポイントは、FIFO(ファーストインファーストアウト)インターフェイス抽象化を提供することです。非キュー方式でデータ構造とやり取りできるようにするには、キューを使用しないでください。

4

キューの中にアイテムを追加することができます(オーバーヘッドのビットを使用して)キュー以外のものを使用できない場所にいる場合は、このページの回答は正しいですが、それが行われるべきかどうかは、別の話です。

var myQueue = new Queue<string>(); 
myQueue.Enqueue("item 0"); 
myQueue.Enqueue("item 10"); 

var myList = myQueue.ToList(); 
myList.Insert(1, "item 5"); 

myQueue = new Queue<string>(myList); 
+1

便利なテクニック。新しい 'Queue'を作成しているので、古いキューを参照している人は誰もあなたの挿入を見ることができません!古いキューが「参照」で渡され、他の誰も古いキューへの参照を「参照していない」場合、時にはOKです。後者の要件は問題です。使用しているクラスを変更できない場合は、新しいオブジェクトを作成することが許可されていない可能性があります。そのような場合は、すべてのアイテムを一時リストにデキューし、挿入してから再びエンキューする必要があります。 – ToolmakerSteve

0

キューの中央に挿入する場合は、「優先キュー」を探している可能性があります。

残念ながら、これは組込みの.NetクラスAFAIKではありません。しかし、少なくとも今あなたはコンセプト名を持っています。

いくつかの可能性が便利なリンクについては、この(クローズ)Q & Aを参照してください:
が質問からの引用 Priority queue in .Net

プライオリティキューは、簡単なソートよりも高い柔軟性を提供するデータ構造ですそれらは新しい要素が任意の間隔でシステムに入ることを可能にするからです。このような到着ごとにすべてを再ソートするよりも、優先順位の高いキューに新しいジョブを挿入するほうがはるかにコスト効率に優れています。

  • 挿入(Q、X):

    基本的なプライオリティキュー

    は、3つの主要操作をサポートしています。アイテムxにキーkが与えられている場合、それを優先キューQに挿入する。
  • Find-Minimum(Q)。項目 へのポインタを返します。キー値は、優先度キュー Q.
  • の削除最小(Q)の他のどのキーよりも小さくなります。キーが最小である優先キューQから項目を削除する
関連する問題