Est-il possible de modifier un élément dans une file d'attente?
Disons que si j'ai une file d'attente de type entier (ou toute catégorie T), puis-je changer la valeur de l'élément dans la file d'attente?
Plus précisément, si je définir la file d'attente comme suit:
Queue<int> q = new Queue<int>();
Pouvons-nous changer la valeur de son élément similaire à la façon dont nous traitons avec un tableau? (si q ont un tableau, nous serions en mesure de faire quelque chose comme ceci: q[0]=1
de changer son élément). J'aimerais juste à simplifier le scénario et l'utilisation int comme exemple, mais mon intention était d'essayer de jeter un regard sur le 1er élément d'une classe de T dans une file d'attente, faire quelques calculs et mise à jour de la file d'attente pour d'autres programmes à traiter. Je ne veux pas de file d'attente parce qu'il l'ordre dans la file d'attente ne seront pas les mêmes que l'original. Espérons que suis en train de faire du sens. Veuillez informer.
- Sont les éléments dans la file d'attente des structures ou classes? Aussi, puis-je vous demander pourquoi vous voulez changer quelque chose dans la file d'attente?
- Pourriez-vous décrire plus en détail pourquoi essayez-vous de le faire?
- Je voudrais utiliser la file d'attente de traitement de l'information. L'Information doit être effectué selon un certain ordre. Chaque module de ne pas disposer de toutes les informations et ce serait bien si chaque module de mise à jour d'un élément et à la fin de la "chaîne de montage", il sera traité totalement.
- Vous ne pouvez pas remplir la file d'attente basé sur l'élément précédent de l'activité? Utiliser presque comme la façon dont le spouleur d'impression teste si il y a une autre page à imprimer basé sur les plus récentes contenu de la page.
Vous devez vous connecter pour publier un commentaire.
Si l'élément dans la file d'attente était une mutable type, alors vous pouvez changer la valeur que la file d'attente est que c'est le premier élément. Sans re-création de la file d'attente, ou d'effectuer beaucoup de place en file d'attente/retire il n'y a aucun moyen de modifier l'élément à l'avant de la file d'attente.
Comme un exemple du premier cas, si vous avez eu une
Queue<MyClass>
avec une définition de:Queue
est conçu pour vous donner le premier élément ou chaque élément, mais pas le n-ième élément.Vous ne pouvez pas directement modifier un élément dans
Queue
(bien que vous pouvez utiliser une solution de contournement comme suggéré Tudor). Mais si vous voulez avoir une file d'attente, vous n'avez pas à utiliserQueue
. Une autre type de .Net estLinkedList
. Il vous permet d'ajouter et de supprimer des choses à partir de deux extrémités, ce qui peut être utilisé dans votre scénario:Il semble que vous souhaitez faire pour traiter chaque élément par plusieurs modules dans l'ordre. Mais je ne suis pas sûr que ce soit la bonne façon de faire ce genre de travail. Une meilleure façon peut-être d'avoir une file d'attente entre deux modules. Un module de toujours prendre un élément à partir de son entrée en file d'attente, et puis le mettre dans sa file d'attente de sortie.
L'un des avantages de cette approche est de plus de flexibilité: un module peut avoir différent type de la sortie que de l'entrée, qui n'est pas possible avec le “une de file d'attente” de la démarche (sauf si vous recourir à avoir une file d'attente de
object
s, ou quelque chose comme ça).TPL Dataflow (nouvelle dans .Net 4.5) utilise cette approche pour améliorer les performances grâce à la parallélisation. Il peut le faire, parce que chaque module peut traiter des éléments indépendamment des autres modules si vous n'avez pas une seule file d'attente centrale.
Vous pouvez utiliser un simple wrapper:
Queue
implémenteIEnumerable
. Donc, vous pourriez faire quelque chose commeq.ElementAt(10).Value = 42;
. Mais je ne voudrais certainement pas recommander de le faire (entre autres choses parce qu'il est lent).Aussi longtemps que vous êtes le stockage d'un type de référence comme une classe, toutes les modifications que vous apportez à se refléter dans la File d'attente. La sortie du code ci-dessous seront "2":
Strictement ce n'est pas la mutation de la File d'attente de la ré-affectation obligatoire.
La réponse simple est non. Il ne fait pas partie de l'API de la File d'attente objet
http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx
Cependant tout est possible bien sûr. Vous pourriez écrire une méthode d'extension pour ce faire, mais il aurait à travailler avec l'API de l'objet et ainsi de retirer /mettre en file d'attente tous les articles avec le changement tout en préservant l'ordre.
Mais si vous voulez le faire, vous êtes le traitement de la File d'attente comme une Liste, alors pourquoi ne pas utiliser une Liste?
Queue
qui ne devrait pas être utilisé. La question est de parler deQueue<T>
.