ジェネリックコレクションを、ある時点ではリストとして扱い、別の時点ではスタックまたはキューとして扱う必要がある場合が複数あります。私が現在開発しているアプリケーションの場合、3つの別々のオブジェクトを使用することは意味がありません。
私が考えることができる最も簡単な解決策は、標準のリストにキュー/デキュー/プッシュ/ポップ/ピーク関数を実装することでした。また(以下のコードには含まれていません)、インターフェイス制約がTに適用され、クラスが各リスト、キュー、およびスタックの位置/序数インデックスを維持できるようにします。
public class List<T>:
System.Collections.Generic.List<T>
{
private object SyncRoot = new object();
public void Enqueue (T item)
{
lock (this.SyncRoot)
{
this.Add(item);
}
}
public T Dequeue ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [0];
this.RemoveAt(0);
}
}
return (item);
}
public void Push (T item)
{
lock (this.SyncRoot)
{
this.Add(item);
}
}
public T Pop ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [this.Count - 1];
this.RemoveAt(this.Count - 1);
}
}
return (item);
}
public T PeekQueue ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [0];
}
}
return (item);
}
public T PeekStack ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [this.Count - 1];
}
}
return (item);
}
}
- これは大まかなオンザフライの実装であるため、どのコーナーケースに注意すべきかわからないので、既存のそのような実装へのポインタまたはリンクをいただければ幸いです。
- 第二に、私は非常に大きなリストでのパフォーマンスに懐疑的です。大きなリストにたとえばLinkedListを使用するよりも、Listから継承する方が適切ですか。私の場合、リストを列挙するよりもアイテムの追加/削除の方が優先されます。