Comment voulez-vous obtenir le premier et le dernier élément dans une File d'attente?
Dire que j'ai un recueil de valeurs où je spécifier la taille de la collection et chaque fois qu'une nouvelle valeur est ajoutée, toutes les anciennes valeurs au-delà de cette taille spécifiée sont déposés. Évidemment (et j'ai testé ce) le meilleur type de collection à l'utilisation de ce comportement est une File d'attente:
myQueue.Enqueue(newValue)
If myQueue.Count > specifiedSize Then myQueue.Dequeue()
Cependant, que faire si je veux calculer la différence entre le premier et le dernier élément de la File d'attente? Évidemment, je ne peux pas accéder aux éléments par index. Mais pour passer d'une File d'attente de quelque chose de la mise en œuvre de IList semble exagéré, tout comme l'écriture d'une nouvelle File d'attente-comme la classe. Maintenant j'ai:
Dim firstValue As Integer = myQueue.Peek()
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1)
Dim diff As Integer = lastValue - firstValue
Cet appel à ToArray()
qui me dérange, mais une alternative supérieure ne vient pas à moi. Des suggestions?
Non, C# n'est pas n'importe quel type, .Net est ce qu'a des types; et .Net n'a pas une file d'attente de type, il a une File d'attente/Attente de<T> le type qui a une file d'attente de la méthode.
OriginalL'auteur Dan Tao | 2009-08-20
Vous devez vous connecter pour publier un commentaire.
Une chose que vous pourriez faire est d'avoir une variable temporaire qui stocke la valeur qui vient d'être mis en file d'attente parce que ce sera la dernière valeur et donc la variable peut être consulté pour obtenir cette valeur.
Merci. Je suis content d'avoir pu donner une bonne suggestion.
OriginalL'auteur murgatroid99
Me semble si vous avez besoin d'un accès rapide vers le premier élément de la liste, puis vous utilisez la mauvaise structure de données. Basculer dans une LinkedList à la place, qui bénéficie de la Première et de la Dernière propriétés.
Assurez-vous que ajouter et supprimer des éléments de la liste chaînée à l'aide de AddLast et RemoveFirst pour maintenir la File d'attente à la propriété. Pour éviter de vous intempestive de violer la propriété de File d'attente, pensez à créer une classe wrapper autour de la liste, et de les exposer uniquement les propriétés que vous avez besoin de votre file d'attente.
OriginalL'auteur Juliet
Edit:
Évidemment, cette classe de base devrait être plus robuste, notamment pour protéger la Dernière propriété sur une zone vide de la file d'attente. Mais cela devrait être assez pour l'idée de base.
Ce qui se passe lorsque le dernier élément est supprimé? Comment vous définissez
Last
à l'avant-dernier élément, alors?OriginalL'auteur xanadont
Votre meilleur pari serait de garder une trace de la dernière valeur ajoutée à la
Queue
, puis utilisez lemyQueue.Peek()
fonction pour voir la "première" (suivant) de l'élément dans la liste sans le supprimer.OriginalL'auteur Adam Robinson
Vous pourrait utilisation d'un deque (double-edemvso file d'attente).
Je ne pense pas qu'il y est un construit dans le Système.Des Collections.Générique), mais voici un peu d'info sur la structure des données. Si vous avez mis en place quelque chose comme cela, vous pouvez simplement utiliser PeekLeft() et PeekRight() pour obtenir la première et la dernière valeur.
Bien sûr, ce sera à vous de décider si ou de ne pas implémenter votre propre deque est préférable de traiter avec le unsexiness de ToArray(). 🙂
http://www.codeproject.com/KB/recipes/deque.aspx
OriginalL'auteur cakeforcerberus