2012-03-11 12 views
2

私はmenthod Reverse()という拡張子を使用していますが、何もしていないようです。 MSDNは遅延実行として実装されていると述べていますが、これを動作させることはできません。キューを逆転する

ここで私はそれをどのように呼びます。

このメソッドは遅延実行を使用して実装されています

 Queue<T> currentPath = new Queue<T>(); 
     currentPath.Enqueue(someValue); 
     currentPath.Enqueue(someValue2); 

     currentPath.Reverse(); 

これはMSDNが言うことです。即時戻り値は、アクションを実行するために必要なすべての情報を格納するオブジェクトです。このメソッドによって表されるクエリは、GetEnumeratorメソッドを直接呼び出すか、Visual C#でforeachを使用するかVisual BasicでFor Eachを使用してオブジェクトが列挙されるまで実行されません。

GetEnumeratorを呼び出すことによって、どういう意味がわかりません。私は単に無駄に以下を実行していることを試してみた:

currentPath.Reverse(); 
currentPath.GetEnumerator(); 

私は任意の助けをいただければ幸い、ここは非常に愚かな何かをやっている感じがしました!

答えて

11

反転は逆のシーケンスを返します。オリジナルは変更されません。逆転項目のうち、新しいキューを構築するために、このような何かを試してみてください:

currentPath = new Queue<T>(currentPath.Reverse()); 

GetEnumeratorメソッドを呼び出しに関するドキュメントの会談は、それがリバース()によって返されたIEnumerableを上の意味:

もちろん
IEnumerable reversed = currentPath.Reverse(); 
IEnumerator reversedEnumerator = reversed.GetEnumerator(); 
// Now reversedEnumerator has assembled the reversed sequence, 
// we could change the contents of currentPath and it wouldn't 
// affect the order of items in reversedEnumerator. 

foreachはカバーの下に私たちのためにそれを行いますので、このような列挙子を取得する必要は、めったにありません。

IEnumerable reversed = currentPath.Reverse(); 
foreach (var item in reversed) 
{ 
    // ... 
} 

または実際に、私の最初の例のように、私たちは、このようなQueueListなど、コレクションのコンストラクタに逆転列挙を渡すことができ、それが反復を実行してみましょう:

currentPath = new Queue<T>(currentPath.Reverse()); 
+0

ああ、:ここで

は、MSDNコードで言っていることです。私は混乱していると思います。なぜなら、Reverseがリスト上で呼び出されると、元のものを変更するからです(ReverseはListの拡張メソッドではありません)。ありがとう:) – Benzino

2

Reverse()は、LINQの演算子です。これは、あなたが仲介しているシーケンスで操作するために使用されます。したがって、次のような結果が得られます。

foreach (var value in currentPath.Reverse()) 
{ 
    // Do something 
} 

これは、キュー内の項目を逆順に繰り返します。実際のキューは変更されません。

あなたは、このような既存のキューの逆として、新しいキューを作成することができます。

var newQueue = new Queue<T>(currentPath.Reverse()); 
+0

'逆'は演算子ですか? –

+0

最後にチェックしたのはLINQメソッドです。 :) – Bernard

+0

@ M.Babcock - これはLinqメソッドとクエリ演算子です。 –

1

あなたがReverse()メソッドを呼び出した後にキューを反復処理しようとしたことがありますか?私のどのように愚かな

foreach (T item in currentPath.Reverse()) 
{ 
    // Do something with current item in queue. 
} 
関連する問題