2010-06-20 9 views
6

Mam zsynchronizowaną Hashtable z int jako kluczem i niestandardową klasą o nazwie Job jako wartością. Chciałbym przefiltrować tę Hashtable na podstawie właściwości w mojej klasie Job o nazwie JobSize. JobSize to tylko enum o wartościach Small, Medium i Large.Użyj Linq do filtrowania Hashtable na podstawie właściwości obiektu niestandardowego Values ​​

Jest w porządku, jeśli konieczne jest przekonwertowanie go na inny typ kolekcji.

wiem, że to śliska LINQy sposobem, aby to zrobić, ale nie znalazłem go jeszcze ...

+0

Jeśli to możliwe, należy użyć kolekcji generycznych, w tym przypadku '' Dictionary . – svick

+0

@svick: Tak, masz rację. Właśnie mam leniwość na temat bezpieczeństwa wątków, ale jest to lepsza opcja ... i ostatecznie, prawdopodobnie bezpieczniejsza, ponieważ będę bardziej ostrożny niż tylko zależnie od zsynchronizowanej Hashtable, aby magicznie zająć się wszystkim dla mnie. –

Odpowiedz

14

to wygląda to będzie działać dla mnie:

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

w ".Cast<Job>()" jest wymagane, ponieważ Hashtable jest non-generic.

+0

Powinieneś rozważyć użycie ogólnego odpowiednika "Hashtable", takiego jak słownik . Uzyskanie zsynchronizowanej tabeli Hashtable może nie rozwiązać samodzielnie wszystkich problemów dotyczących współbieżności. Ponadto .NET 4 dodaje ConcurrentDictionary, który jest bezpieczny dla wątków. – Jacob

+0

potwierdzone, to by to zrobiło :) – spookycoder

0

Powinieneś móc używać coś takiego:

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

To co próbowałem początkowo, ale mam ten błąd: argumentów dla metody typu „IEnumerable System.Linq.Enumerable.Where (ta IEnumerable , Func )” nie można wywnioskować z wykorzystaniem . Spróbuj jawnie określić argumenty typu. Więc zrobiłem (lub, pomyślałem ja): var smallJobs = hashTable.Values.Where (praca => job.JobSize == JobSize.Small); , ale oczywiście dodanie oznacza, że ​​nie mogę przekonwertować z typu nietypowego na typ ogólny. –

+0

'Hastable' nie jest ogólny, więc musisz najpierw" Cast() ". – svick

+0

Nie ma 'System.Collections.Generic.Hashtable'. – svick

1

Czy potrzebujesz zachować klucze i wartości w przefiltrowanym Hashtable? Jeśli tak, spróbuj tego.

Będzie filtrować Hashtable i powrócić przefiltrowane wyniki silnie wpisane 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); 
Powiązane problemy