2010-06-20 77 views
6

我有一个以int为键的同步Hashtable和一个名为Job的自定义类作为值。我想根据我的Job类中名为JobSize的属性过滤此Hashtable。 JobSize只是一个enum,其值为Small,MediumLarge使用Linq来过滤基于Value自定义对象属性的Hashtable

这很好,如果它需要转换为另一种集合类型来做到这一点。

我知道有一个漂亮的LINQy办法做到这一点,但我还没有找到它......

+0

如果可能的话,你应该使用泛型集合,在这种情况下'字典'。 – svick 2010-06-20 19:10:30

+0

@svick:是的,你说得对。我对线程的安全性只是懒惰,但这是一个更好的选择......并且最终可能更安全,因为我会更加小心,而不是仅仅依赖于同步Hashtable来神奇地为我处理所有事情。 – 2010-06-21 05:47:24

回答

14

它看起来像这会为我工作:

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

的“.Cast<Job>()”是必需的,因为Hashtable的不通用。

+0

你应该考虑使用一个通用的相当于'Hashtable'就像字典。获取同步Hashtable可能不会解决所有的并发问题。此外,.NET 4还添加了线程安全的ConcurrentDictionary。 – Jacob 2010-06-20 19:09:24

+0

确认,这会做到这一点:) – spookycoder 2010-06-20 19:23:45

0

你应该能够使用这样的事情:

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

这就是我最初尝试,但我得到这个错误: 的方法的类型参数“的IEnumerable System.Linq.Enumerable.Where (这IEnumerable的,Func键的)”不能从使用推断。尝试明确指定类型参数。 所以,我做了(或者,我以为我做到了): var smallJobs = hashTable.Values.Where (job => job.JobSize == JobSize.Small); 但是,当然,增加意味着我不能从非泛型类型转换为泛型类型。 – 2010-06-20 18:45:32

+0

'Hastable'不是通用的,所以你必须首先'Cast()'。 – svick 2010-06-20 19:09:44

+0

没有'System.Collections.Generic.Hashtable'。 – svick 2010-06-21 09:34:25

1

是否需要维护过滤器Hashtable中的键和值?如果是这样,试试这个。

它会过滤Hashtable作为一个强类型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); 
相关问题