2010-06-20 11 views
6

Ho una Hashtable sincronizzata con int come chiave e una classe personalizzata denominata Job come valore. Vorrei filtrare questo Hashtable basato su una proprietà nella mia classe di lavoro chiamata . è solo un enum con valori Small, Medium e Large.Utilizzare Linq per filtrare Hashtable in base a una proprietà dell'oggetto Valore dell'oggetto

Va bene se deve essere convertito in un altro tipo di raccolta per farlo.

So che c'è un modo LINQy chiazza di petrolio per fare questo, ma non ho ancora trovato ...

+0

Se possibile, si consiglia di utilizzare le collezioni generiche, in questo caso '' dizionario . – svick

+0

@svick: Sì, hai ragione. Sono solo diventato pigro sulla sicurezza dei thread, ma è un'opzione migliore ... e alla fine, probabilmente più sicura perché sarò più attento piuttosto che dipendere da una Hashtable sincronizzata per occuparmi magicamente di tutto per me. –

risposta

14

Sembra questo lavoro per me:

var smallJobs = hashTable.Values.Cast<Job>().Where(job => job.JobSize == JobSize.Small); 

Il ".Cast<Job>()" è necessaria perché Hashtable non è generica.

+0

Dovresti considerare di usare un equivalente generico a "Hashtable" come Dizionario . Ottenere una Hashtable sincronizzata potrebbe non risolvere da solo tutti i tuoi problemi di concorrenza. Inoltre, .NET 4 aggiunge ConcurrentDictionary, che è thread-safe. – Jacob

+0

confermato, questo lo farebbe :) – spookycoder

0

Si dovrebbe essere in grado di usare qualcosa di simile:

IEnumerable<Job> smallJobs 
    = hashTable.Values.Cast<Job>.Where(job => job.JobSize == JobSize.Small); 
+0

Questo è quello che ho provato inizialmente, ma ho ottenuto questo errore: Gli argomenti di tipo per il metodo 'IEnumerable System.Linq.Enumerable.Where (questo IEnumerable , Func )' non può essere desunta dall'uso . Prova a specificare esplicitamente gli argomenti del tipo. Quindi, l'ho fatto (o, pensavo di averlo fatto): var smallJobs = hashTable.Values.Where (processo => ​​job.JobSize == JobSize.Small); ma poi, naturalmente, aggiungendo significa che non riesco a convertire dal tipo non generico al tipo generico. –

+0

'Hastable' non è generico, quindi devi prima' Cast() '. – svick

+0

Non c'è 'System.Collections.Generic.Hashtable'. – svick

1

È necessario mantenere le chiavi e i valori nel filtro Hashtable? Se è così, prova questo.

Sarà filtrare il Hashtable e restituire i risultati filtrati come fortemente tipizzato Dictionary<int,Job>:

var filtered = yourHashtable.Cast<DictionaryEntry>() 
          .Where(x => ((Job)x.Value).JobSize == JobSize.Small) 
          .ToDictionary(x => (int)x.Key, x => (Job)x.Value); 
Problemi correlati