12
votes

Sélection d'un objet spécifique dans la file d'attente (c.-à-d. Peek +1)

Si Pek renvoie l'objet suivant dans une file d'attente, est-il une méthode que je peux utiliser pour obtenir un objet spécifique? Par exemple, je souhaite trouver le troisième objet dans la file d'attente et changer l'une de ses valeurs?

En ce moment, je fais juste une forise à travers la file d'attente qui pourrait être la meilleure solution, mais je ne savais pas s'il y avait quelque chose de spécial que vous pouvez utiliser avec le coup d'œil? Ie la file d'attente.peek (2)


0 commentaires

4 Réponses :


20
votes

Si vous souhaitez accéder aux éléments directement (avec une opération O (1) ), utilisez un tableau au lieu d'une file d'attente, car une file d'attente a une fonction différente (FIFO).

Un fonctionnement d'accès aléatoire sur une file d'attente sera O (n) car il doit itérer sur chaque élément de la collection ... qui le rend à son tour séquentiel accès, plutôt que d'accès aléatoire direct.


Ensuite, puisque vous utilisez c #, vous pouvez utiliser file d'attente.Elementat (n) à partir de system.linq (puisque file d'attente Implexes iEnumerable ) mais qui ne sera pas o (1) c'est-à-dire qu'il ira toujours sur les éléments.


2 commentaires

Accéder à un élément aléatoire dans une file d'attente implémentée avec un tampon cyclique, comme La file d'attente , est une opération O (1) . Queue a même un getElement (int) méthode qui fait cela, mais malheureusement, il est marqué comme interne . Bien sûr, on peut mettre en œuvre sa propre classe de file d'attente qui permet un accès aléatoire ou d'utiliser le CircularQueue classe de la C5 générique Bibliothèque de collecte qui a un O (1) Enqueue, dequeuse et l'accès aléatoire (et même enfoncez et POP).


Ceci s'applique uniquement à la classe de file d'attente intégrée. La classe d'attente .NET n'expose pas d'indexeur, mais vous pouvez évidemment calculer l'index du nième article ... Fonction Peek (n) {retour _buffer [(CurrentIndex + n)% _buffer.length] ; une implémentation différente pourrait facilement fournir cette fonctionnalité.



4
votes

foreach à travers une file d'attente. Genre de paradoxe.

Toutefois, si vous pouvez être foreach, il s'agit d'une iNeuble, de sorte que les extensions LINQ habituelles s'appliquent: P>

queue.ElementAt(1)


0 commentaires

1
votes

Vous pouvez faire quelque chose comme celui-ci comme une éteint:

object thirdObjectInQueue = queue.ToArray()[2];


2 commentaires

Celui-ci est particulièrement utile si l'on doit avoir plusieurs éléments.


C'est une idée horrible, mais depuis que vous avez reconnu que je ne voterai pas



9
votes

Bien que ce soit toujours O (n), il est certainement plus facile de lire si vous utilisez les méthodes d'extention LINQ ELEMENTAT () ou ELLETORDEFAULT () , ce sont des étendues de iEnumerable , lequel file d'attente implémente. xxx

EDIT Si vous allez avec les autres suggestions de conversion de votre file d'attente en un tableau juste pour cette opération que vous devez décider si les tailles probables de votre file d'attente et la distance de l'index que vous rechercherez depuis le début de votre file d'attente justifie. le O (n) le fonctionnement de l'appelant .totarray (). ELEMENTAT (M), sans oublier les exigences de l'espace de la création d'un emplacement de stockage secondaire.


1 commentaires

@Andreas: Bon point, je venais d'utiliser l'objet à titre d'exemple, édité pour utiliser le paramètre générique.