11
votes

Comment obtiendriez-vous les premier et les derniers articles dans une file d'attente?

Dites que j'ai une collection de valeurs roulantes dans laquelle je spécifie la taille de la collection et une nouvelle valeur ajoutée une nouvelle valeur, toutes les valeurs anciennes au-delà de cette taille spécifiée sont déposées. Évidemment (et j'ai testé cela), le meilleur type de collection à utiliser pour ce comportement est une file d'attente: xxx pré>

Cependant, que si je veux calculer la différence entre les premier et dernier éléments dans la file d'attente? Évidemment, je ne peux pas accéder aux articles par index. Mais pour passer d'une file d'attente à quelque chose d'implémenter ilcone semble être trop excédant, de même que l'écriture d'une nouvelle classe semblable à la file d'attente. À l'heure actuelle, j'ai: P>

Dim firstValue As Integer = myQueue.Peek()
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1)
Dim diff As Integer = lastValue - firstValue


2 commentaires

Ne c # a-t-il un type de dequeux?


Non, c # n'a aucun type, .NET est ce qui a des types; Et .NET N'a pas de type de dequeuse, il possède une file d'attente / la file d'attente qui a une méthode de dequeuse.


5 Réponses :


20
votes

Une chose que vous pourriez faire est d'avoir une variable temporaire qui stocke la valeur qui vient d'être enqueuse que ce soit la dernière valeur et que la variable peut donc être accessible pour obtenir cette valeur.


1 commentaires

À peu près au même moment, vous avez fourni cette réponse, j'ai réalisé à quel point la solution (ce que vous avez suggéré, fondamentalement). Bon appel!



2
votes

Votre meilleur pari serait de garder une trace de la dernière valeur ajoutée à la queue , puis utilisez la fonction myQuue.peek () fonction pour voir "premier" ( Signification suivant) élément dans la liste sans le retirer.


0 commentaires

2
votes

vous pourrait utiliser une dentelle ( d ouble- e nded File d'attente ).

Je ne pense pas qu'il y ait un intégré à System.Collections (.Generic) mais voici quelques informations sur la structure de données. Si vous avez implémenté quelque chose comme ceci, vous pouvez simplement utiliser PEEKLEFT () et PEEKRight () pour obtenir les premières et dernières valeurs.

Bien sûr, ce sera à vous de décider si la mise en œuvre de votre propre dent est préférable à traiter avec la négligence de Toarray (). :)

http://www.codeproject.com/kb/recipes/deque.aspx


0 commentaires

15
votes

Il me semble que si vous avez besoin d'un accès rapide au premier élément de la liste, vous utilisez la mauvaise structure de données. Allumez une liaison linked, qui a commodément les premières et les dernières propriétés.

Assurez-vous que vous n'ajoutez que d'ajouter et de supprimer des éléments dans la liste liée à l'aide de AddLast et de SupprimerFirst pour maintenir la propriété de la file d'attente. Pour vous empêcher de violer par inadvertance la propriété de la file d'attente, envisagez de créer une classe wrapper autour de la liste liée et de l'exposition uniquement des propriétés dont vous avez besoin de votre file d'attente.


1 commentaires

Malheureux mais mieux que de garder une trace de la dernière fois ajoutée en dehors de la structure de données elle-même.



5
votes
public class LastQ<T> : Queue<T>
{
    public T Last { get; private set; }

    public new void Enqueue(T item)
    {
         Last = item;
         base.Enqueue(item);
    }
}
Edit:
Obviously this basic class should be more robust to do things like protect the Last property on an empty queue.  But this should be enough for the basic idea.

2 commentaires

Ha! C'est presque Verbatim le code que je viens d'écrire. (Seule différence est le nom de la classe et je mets dernier = élément après la base.enqueue (élément)).


Que se passe-t-il lorsque le dernier élément est supprimé? Comment définiriez-vous dernier au deuxième dernier élément alors?