2009-05-11 2 views
3

奇妙なことに、スタックコレクションではむしろ基本的なシフトとシフト不能なメソッド*がなくなっているようですが、私は2.0で作業しています。スタックコレクションにC#2.0のシフトとシフト不足があります

これらのメソッドを利用できる合理的なテクニックまたは代替コレクションクラスはありますか?私はプッシュとポップが必要です。

編集:私はしたいコレクションのように見えるが、実際に喜んでネイティブではないdequeであるC#:(

私は不格好なのLinkedListと一緒に行くことになりますので、この時点で、サードパーティのライブラリを使用することはできません(読んで削除するとシフトが1になる二つの操作ですので、私は不格好と言う)が、私は拡張メソッドへのアップグレード、より良いまだそれを使用することができます誰にもPowerCollectionsのアプローチをお勧めします。または、と思う。

ため息


*申し訳ありませんが、私はこれらが珍しい用語ではないことを認識していませんでした。私はAPIでどこを見つけるべきか分かりませんでした。参考のために:

シフト=最初の要素

アンシフトを削除=スタックのアンシフトシフト/聞いたことがないコレクション

+0

私は自分のブログに_immable deque_のC#実装を投稿しました。あなたは何でも好きなものを自由に使うことができます。コードはテストされていません!購入者が注意するなど http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx –

答えて

14

私はLinkedList<T>を使用します。正面から追加したり、前面から取り除いたり、背面に追加したり取り除いたりする方法もあります。私はシフトとシフトを聞いたことはありませんが、私はそれが何を意味していると仮定しています。

+0

それも私の考えでした。 –

+0

ありがとうございました。ありがとう.Net Framework:D !!他の多くの言語と比較してC#を使用するのが簡単です。 – Samuel

9

の先頭に要素を挿入します。 StackクラスはPop,PeekPushを提供します。

+2

javascript少なくともpush/popの論理的な反対です。 – annakata

+3

しかし、従来の 'スタック'データ構造の一部ではありません。 –

+0

@Annakata:PerlとJavaScriptは、これらのメソッドをスタックではなく配列に配置し、配列をキュー、スタック、およびデキューとして使用できるようにします。 .NETは、型システムではより特定的です(静的な型指定のafterallです)。 – Richard

1

fake extension methodsは、C#3.0ターゲティング2.0を使用している限り使用できます。

シフト/シフト不変の操作について説明できますか?

+0

VS2k8はありません。しかし、私は2.0にコンパイルする必要がありますが、とにかく参考になります。 – annakata

1

定義によってStackクラスは、要素の追加と削除のためにLast In First Out(LIFO)技術を使用してコレクション内の要素を管理する方法を表します。 LIFOは、コレクションに追加された最後の要素が自動的に削除されることを意味します。

あなたはそれから必要な機能は何かカスタムですが、簡単に次のように

public class MyStack<T>:Stack<T>{ 
    public void Shift(T item){ 
    // load stack into internal ordered list 
    // clear stack content 
    // insert into internal list at desired location 
    // populate stack with content from internal list 
    } 
    public void Unshift(T item){ 
    // load stack into internal ordered list 
    // clear stack content 
    // insert into internal list at desired location 
    // populate stack with content from internal list 
    } 
} 

を達成することができ、このこと-sのすべてを思わ:)

+0

それがどのように役立つか分かりません。スタック内の何もないは、それらの操作を実行するために基礎となる配列へのアクセスを提供します。 –

+1

私が言っていることは、基礎となるデータにアクセスできないので、O(1)操作をO(n)に変えているということです。これは非常に非効率的なやり方です。そう思わないのですか? –

+0

かもしれませんが、参照順序を変更するだけで(コンテンツオブジェクト)再生するのは苦痛ではありません。機能が「必須」である場合は、パフォーマンスに対して慎重にテストする必要があります。もう一度...ちょうど注文し、さらにポップをして、 – ruslander

6

ます場合は、間違ったクラスを使用していますshift/unshiftメソッドが必要です。 A stackは、LIFO(Last-In First-Out)データ構造です。

ポップやプッシュなしでシフト/シフトを変更したい場合は、Queueを使用します。あなたは両方をしたい場合、私はスタックの要素数を返しませんPowerCollectionsライブラリ

+0

の後で再プッシュすることは悲しいことではありませんが、 "deque"という言葉は私に答えをくれました – annakata

0
Shift ==> Stack.Pop 
Unshift ==> Stack.Push 

UnshiftからDequeを使用することをお勧めします、あなたはそのためStack.Count性質を持っています。

また、最初の要素を削除せずに取得するには、Stack.Peekがあります。

Stack<T> class

+0

shift/unshift!= push/pop - 前者は後者コレクションの終わりに。まったく異なる。 – annakata

+0

StackはLIFOなので、pushとpopの両方がCollectionの上部で動作します。 Javascriptでは、shiftとunshiftの両方が配列の先頭で動作します。http://www.exforsys.com/tutorials/javascript/javascript-array-object-methods-part-2/1.html – DonkeyMaster

1

これはまさに最高ではないですが、それはシフト/アンシフトとプッシュ/ポップとJavascriptの配列であることに近づきます。それは内部の動作を隠すことはなく、あなたが望むすべての項目にインデックスを付けることができます。私は基本的な機能を持っています。

public class JSList<T> : List<T> 
{ 
    public JSList() : base() {} 

    /// <summary> 
    /// this the add item to the start of the list 
    /// </summary> 
    /// <param name="v"></param> 
    public void Shift(T v) 
    { 
     this.Insert(0, v); 
    } 

    /// <summary> 
    /// remove item at the start of the list 
    /// </summary> 
    /// <returns></returns> 
    public T Unshift() 
    { 
     var toreturn = default(T); 
     if (this.Count > 0) 
     { 
      toreturn = this[0]; 
      this.RemoveAt(0); 
     } 
     return toreturn; 
    } 

    /// <summary> 
    /// Adds object to end of the list 
    /// </summary> 
    /// <param name="v"></param> 
    public void Push(T v) 
    { 
     this.Add(v); 
    } 

    /// <summary> 
    /// removes an item at the end of the list 
    /// </summary> 
    /// <returns></returns> 
    public T Pop() 
    { 
     var toreturn = default(T); 
     if (this.Count > 0) 
     { 
      toreturn = this[this.Count - 1]; 
      this.RemoveAt(this.Count - 1); 
     } 
     return toreturn; 
    } 

    public T Peek() 
    { 
     return this[this.Count - 1]; 
    } 
} 
関連する問題