2010-06-20 26 views
6

Tengo un Hashtable sincronizado con int como clave y una clase personalizada llamada Job como valor. Me gustaría filtrar este Hashtable basado en una propiedad en mi clase de trabajo llamada JobSize. JobSize es solo un enum con los valores Small, Medium y Large.Utilice Linq para filtrar Hashtable en función de una propiedad del objeto personalizado de valores

Está bien si se debe convertir a otro tipo de colección para hacer esto.

Sé que hay una manera LINQy mancha de hacer esto, pero no he encontrado todavía ...

+0

Si es posible, se debe utilizar colecciones genéricas, en este caso '' Diccionario . – svick

+0

@svick: Sí, tienes razón. Me volví perezoso con respecto a la seguridad de los hilos, pero es una mejor opción ... y en última instancia, probablemente sea más segura porque seré más cuidadoso en vez de solo depender de un Hashtable sincronizado para que mágicamente se encargue de todo por mí. –

Respuesta

14

Parece esto va a funcionar para mí:

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

El ".Cast<Job>()" se requiere debido tabla hash es no genérico.

+0

Debería considerar usar un equivalente genérico a 'Hashtable' como Dictionary . Obtener una Hashtable sincronizada puede no resolver todos sus problemas de concurrencia por sí mismo. Además, .NET 4 agrega ConcurrentDictionary, que es seguro para subprocesos. – Jacob

+0

confirmado, esto lo haría :) – spookycoder

0

Usted debe ser capaz de usar algo como esto:

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

Eso es lo que he intentado en un principio, pero me dio este error: Los argumentos de tipo de método 'IEnumerable System.Linq.Enumerable.Where (esto IEnumerable , Func )' no puede deducirse del uso . Intente especificar los argumentos de tipo explícitamente. Entonces, lo hice (o, pensé que lo hice): var smallJobs = hashTable.Values.Where (job => job.JobSize == JobSize.Small); pero luego, por supuesto, agregar significa que no puedo convertir del tipo no genérico al tipo genérico. –

+0

'Hastable' no es genérico, por lo que tiene que' Cast() 'primero. – svick

+0

No hay 'System.Collections.Generic.Hashtable'. – svick

1

¿Necesita mantener las claves y valores en su Hashtable filtrado? Si es así, intente esto.

que va a filtrar el Hashtable y devolver los resultados filtrados como un inflexible 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); 
Cuestiones relacionadas