質問
私は拡張機能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();
私はここでかなり愚かなことをしていると感じています、どんな助けもいただければ幸いです!
解決
Reverse逆になったシーケンスを返します。オリジナルは変更されません。逆になったアイテムから新しいキューを構築するには、このようなことを試してください:
currentPath = new Queue<T>(currentPath.Reverse());
ドキュメントがGetEnumeratorの呼び出しについて話しているとき、それはReverse()によって返された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)
{
// ...
}
または、実際には、私の最初の例のように、逆のenumerableを次のようなコレクションコンストラクタに渡すことができます Queue
または List
そして、それは反復を実行してみましょう:
currentPath = new Queue<T>(currentPath.Reverse());
他のヒント
Reverse()
Linq演算子です。それはあなたが相互作用しているシーケンスを操作するために使用されます。だからあなたはこのようなseomthingを行うことができます:
foreach (var value in currentPath.Reverse())
{
// Do something
}
これにより、キュー内のアイテムが逆の順序で反復処理されます。実際のキューは変更されません。
次のように、既存のキューの逆として新しいキューを作成できます:
var newQueue = new Queue<T>(currentPath.Reverse());
Reverse()
メソッドを呼び出した後にキューを繰り返し繰り返しましたか?
ここにMSDNがコードで言っているものです:
foreach (T item in currentPath.Reverse())
{
// Do something with current item in queue.
}
.