我有一个以int为键的同步Hashtable和一个名为Job
的自定义类作为值。我想根据我的Job类中名为JobSize
的属性过滤此Hashtable。 JobSize
只是一个enum
,其值为Small
,Medium
和Large
。使用Linq来过滤基于Value自定义对象属性的Hashtable
这很好,如果它需要转换为另一种集合类型来做到这一点。
我知道有一个漂亮的LINQy办法做到这一点,但我还没有找到它......
我有一个以int为键的同步Hashtable和一个名为Job
的自定义类作为值。我想根据我的Job类中名为JobSize
的属性过滤此Hashtable。 JobSize
只是一个enum
,其值为Small
,Medium
和Large
。使用Linq来过滤基于Value自定义对象属性的Hashtable
这很好,如果它需要转换为另一种集合类型来做到这一点。
我知道有一个漂亮的LINQy办法做到这一点,但我还没有找到它......
它看起来像这会为我工作:
var smallJobs = hashTable.Values.Cast<Job>().Where(job => job.JobSize == JobSize.Small);
的“.Cast<Job>()
”是必需的,因为Hashtable的不通用。
你应该考虑使用一个通用的相当于'Hashtable'就像字典
确认,这会做到这一点:) – spookycoder 2010-06-20 19:23:45
你应该能够使用这样的事情:
IEnumerable<Job> smallJobs
= hashTable.Values.Cast<Job>.Where(job => job.JobSize == JobSize.Small);
这就是我最初尝试,但我得到这个错误: 的方法的类型参数“的IEnumerable
'Hastable'不是通用的,所以你必须首先'Cast()'。 – svick 2010-06-20 19:09:44
没有'System.Collections.Generic.Hashtable'。 – svick 2010-06-21 09:34:25
是否需要维护过滤器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);
如果可能的话,你应该使用泛型集合,在这种情况下'字典'。 –
svick
2010-06-20 19:10:30
@svick:是的,你说得对。我对线程的安全性只是懒惰,但这是一个更好的选择......并且最终可能更安全,因为我会更加小心,而不是仅仅依赖于同步Hashtable来神奇地为我处理所有事情。 – 2010-06-21 05:47:24