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? P>
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) p>
4 Réponses :
Si vous souhaitez accéder aux éléments directement (avec une opération Un fonctionnement d'accès aléatoire sur une file d'attente sera Ensuite, puisque vous utilisez c #, vous pouvez utiliser O (1) code>), utilisez un tableau au lieu d'une file d'attente, car une file d'attente a une fonction différente (FIFO). p>
O (n) code> strong> 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. p>
file d'attente.Elementat (n) code> à partir de
system.linq code> (puisque
file d'attente code> Implexes
iEnumerable code>) mais qui ne sera pas
o (1) code> c'est-à-dire qu'il ira toujours sur les éléments. P>
Accéder à un élément aléatoire dans une file d'attente implémentée avec un tampon cyclique, comme La file d'attente
O (1) code>.
Queue
getElement (int) code> méthode qui fait cela, mais malheureusement, il est marqué comme
interne code>. 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) code> 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 Fonction Peek (n) {retour _buffer [(CurrentIndex + n)% _buffer.length] ; code> une implémentation différente pourrait facilement fournir cette fonctionnalité.
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)
Vous pouvez faire quelque chose comme celui-ci comme une éteint:
object thirdObjectInQueue = queue.ToArray()[2];
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
Bien que ce soit toujours O (n), il est certainement plus facile de lire si vous utilisez les méthodes d'extention LINQ EDIT FORT>
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. p> p> ELEMENTAT () CODE> ou
ELLETORDEFAULT () CODE>, ce sont des étendues de
iEnumerable
file d'attente
@Andreas: Bon point, je venais d'utiliser l'objet à titre d'exemple, édité pour utiliser le paramètre générique.