Possiedo un numero simultaneo di BlockingCollection
con elementi ripetuti. Come può modificarlo per aggiungere o ottenere elementi distinti?Raccolte simultanee ed elementi univoci
risposta
L'archivio di supporto predefinito per BlockingCollection
è un ConcurrentQueue
. Come ha fatto notare qualcun altro, è piuttosto difficile aggiungere elementi distinti usando quello.
Tuttavia, è possibile creare il proprio tipo di raccolta che implementa IProducerConsumerCollection
e passarlo al costruttore BlockingCollection
.
Immaginate un ConcurrentDictionary
che contenga le chiavi degli articoli attualmente in coda. Per aggiungere un elemento, chiami prima il TryAdd
sul dizionario e, se l'elemento non è nel dizionario, lo aggiungi e lo aggiungi alla coda. Take
(e TryTake
) ottiene l'elemento successivo dalla coda, lo rimuove dal dizionario e lo restituisce.
Preferirei se ci fosse un simultaneo HashTable
, ma poiché non ce n'è uno, dovrete fare con ConcurrentDictionary
.
L'aggiunta di elementi distinti sembra essere [sorprendentemente difficile] (http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection) se non impossibile. 'BlockingCollection' implementa' IEnumerable ', quindi puoi usare' Distinct() '. –
È possibile utilizzare il codice fornito nella domanda StackOverflow collegata da GertArnold, ma restituire sempre true nell'implementazione TryAdd e TryTake di un IProducerConsumerCollection. Questo funzionerebbe. So che è una forma terribile, ma dovrebbe funzionare, e BlockingCollection si sta già rompendo in quanto getta un'eccezione. Che cosa terribilmente fastidiosa. – Kevek