2011-10-04 9 views
5

Possiedo un numero simultaneo di BlockingCollection con elementi ripetuti. Come può modificarlo per aggiungere o ottenere elementi distinti?Raccolte simultanee ed elementi univoci

+1

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() '. –

+0

È 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

risposta

4

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.