5

拡張機能menthodReverse()を使用していますが、何も実行されていないようです。MSDNは、遅延実行として実装されていると述べていますが、これを機能させることができないようです。

これが私がそれを呼ぶ方法です。

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

        currentPath.Reverse();

これはMSDNが言うことです:

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

GetEnumeratorを呼び出すと、それが何を意味するのかわかりません。私はそれを試してみましたが、無駄に次のことを行うだけです。

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

私はここでかなりばかげたことをしているような気がします、どんな助けもいただければ幸いです!

4

3 に答える 3

17

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)
{
    // ...
}

または、実際、最初の例のように、Queueまたはなどのコレクションコンストラクターに逆列挙可能オブジェクトを渡してList、反復を実行させることができます。

currentPath = new Queue<T>(currentPath.Reverse());
于 2012-03-11T23:58:55.233 に答える
2

Reverse()Linq演算子です。これは、対話しているシーケンスを操作するために使用されます。だからあなたはこのような何かをすることができます:

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

これにより、キュー内のアイテムが逆の順序で繰り返されます。実際のキューは変更されません。

次のように、既存のキューの逆として新しいキューを作成できます。

var newQueue = new Queue<T>(currentPath.Reverse());
于 2012-03-11T23:59:41.650 に答える
1

メソッドを呼び出した後、キューを反復処理してみましたReverse()か?

これがMSDNがコードで言っていることです:

foreach (T item in currentPath.Reverse())
{
   // Do something with current item in queue.
}
于 2012-03-12T00:00:46.317 に答える