Question

Je suis l'aide de l'extension menthod Reverse(), mais il ne semble pas faire quoi que ce soit.La MSDN etats, il est mis en œuvre comme une exécution différée, cependant je n'arrive pas à obtenir que cela fonctionne.

Voici comment je l'appelle.

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

        currentPath.Reverse();

C'est ce que le MSDN dit:

Cette méthode est implémentée à l'aide de l'exécution différée.Le retour immédiat de la valeur est un objet qui stocke toutes les informations nécessaires pour effectuer l'action.La requête représentée par cette méthode n'est pas exécutée tant que l'objet est énuméré, soit par l'appel de sa méthode GetEnumerator directement ou par l'utilisation de foreach dans Visual C# ou Pour Chaque dans Visual Basic.

Je ne suis pas sûr de ce que cela signifie en appelant GetEnumerator.J'ai essayé simplement en procédant de la manière suivante avec en vain:

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

J'ai un sentiment que je suis en train de faire quelque chose de tout à fait stupide ici, toute aide serait appréciée!

Était-ce utile?

La solution

Inverse renvoie l'inversion de l'ordre.Il ne modifie pas l'original.Essayez quelque chose comme cela, pour construire une nouvelle File d'attente de l'inversion des éléments:

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

Lorsque la documentation parle de l'appel de GetEnumerator, cela signifie que sur l'interface IEnumerable qui a été renvoyé par Reverse():

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.

Bien sûr, il y a rarement besoin d'obtenir de l'agent recenseur comme ça, parce que foreach le fera pour nous sous les couvertures:

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

Ou en effet, comme dans mon premier exemple, nous pouvons passer à l'inversion de l'énumérable d'une collection constructeur comme Queue ou List et de permettre d'effectuer l'itération:

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

Autres conseils

Reverse() est une Linq opérateur.Il est utilisé pour fonctionner sur une séquence que vous êtes interating plus.Donc, vous pourriez faire seomthing comme ceci:

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

Cela va itérer sur les éléments dans la file d'attente dans l'ordre inverse.La réelle file d'attente reste inchangé.

Vous pouvez créer une nouvelle file d'attente comme un revers de la de files d'attente comme ceci:

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

Avez-vous essayé de parcourir la file d'attente après l'appel de la Reverse() méthode?

Voici ce que MSDN est dit dans le code:

foreach (T item in currentPath.Reverse())
{
   // Do something with current item in queue.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top