Ho tre attributi per un utente: connectionId
(ad es. "sd4-h4sdg-u4j-a2rr3"), userName
e placeInLine
.
Non riesco a pensare a una singola struttura dati che gestirà il mio scenario di consentire solo a un singolo utente di lavorare su una determinata risorsa di pagina Web e di far avanzare la linea di persone mentre ogni utente attivo lascia la propria connessione. Sto usando C # / SignalR con jQuery.
Quando un utente (Adam) colpisce la pagina, se questa struttura dati proposta è vuota, arriva a interagire con la pagina. Il prossimo utente che arriva (Bob) mentre Adam sta lavorando viene messo in linea. Quindi salviamo il suo userName, connectionId e mettiamo in linea come 1
. Carl arriva e viene messo in riga, ottenendo placeInLine=2
. David è 3
, ecc.
Ora, in un mondo perfetto, tutti aspetteranno pazientemente il proprio turno e verranno avvisati quando l'utente davanti a loro si disconnette, in modo che possa avere il proprio turno sulla pagina. In questo scenario, un Queue
funzionerebbe. Tuttavia: se Carl lascia, non possiamo semplicemente rimuoverlo dal Queue
poiché si trova nel mezzo [B, C, D]
. Voglio che questo codice venga ridimensionato, quindi ricostruire una coda con ogni modifica non è un'opzione.
Se usassi Dictionary
, potrei avere userName
come chiave, con un valore di placeInLine
. Ma in questo scenario, non posso ottenere il prossimo utente, poiché Get()
avviene tramite Key. Se placeInLine
int è la chiave, non riesco a rimuovere un utente in base al nome utente poiché Remove()
viene eseguito anche con la chiave.
Sono ingenuo per presupporre che questo dovrebbe essere possibile con una singola struttura dati?