C# 使用Linq根据自定义对象值的属性筛选哈希表

C# 使用Linq根据自定义对象值的属性筛选哈希表,c#,linq,C#,Linq,我有一个以int为键的同步哈希表,还有一个名为Job的自定义类作为值。我想根据作业类中名为JobSize的属性筛选此哈希表作业大小只是一个枚举,其值为小、中和大 如果需要将其转换为另一个集合类型来执行此操作,则没有问题 我知道有一种灵巧的方法可以做到这一点,但我还没有找到它…您应该能够使用这样的方法: IEnumerable<Job> smallJobs = hashTable.Values.Cast<Job>.Where(job => job.JobSize

我有一个以int为键的同步哈希表,还有一个名为
Job
的自定义类作为值。我想根据作业类中名为
JobSize
的属性筛选此哈希表<代码>作业大小只是一个
枚举
,其值为

如果需要将其转换为另一个集合类型来执行此操作,则没有问题


我知道有一种灵巧的方法可以做到这一点,但我还没有找到它…

您应该能够使用这样的方法:

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

看起来这对我很有用:

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

.Cast()
”是必需的,因为哈希表是非泛型的。

是否需要维护筛选后的
哈希表中的键和值?如果是这样,试试这个

它将过滤
哈希表
,并将过滤结果作为强类型
字典
返回:

var filtered=yourHashtable.Cast()
.Where(x=>((作业)x.Value.JobSize==作业大小.Small)
.ToDictionary(x=>(int)x.Key,x=>(Job)x.Value);

这是我最初尝试的,但我得到了一个错误:“IEnumerable System.Linq.Enumerable.Where(this IEnumerable,Func)”方法的类型参数无法从用法中推断出来。尝试显式指定类型参数。所以,我做到了(或者,我认为我做到了):var smallJobs=hashTable.Values.Where(job=>job.JobSize==JobSize.Small);但是,当然,添加意味着我不能从非泛型类型转换为泛型类型。<代码> HaStase< /C> >不是通用的,因此必须首先使用代码> Case>()/代码>。获取一个同步哈希表本身并不能解决所有的并发问题。另外,.NET 4还添加了ConcurrentDictionary,它是线程安全的。如果可能,您应该使用泛型集合,在这种情况下,
Dictionary
@svick:Yep,您是对的。我只是懒得考虑线程安全,但这是一个更好的选择。。。最终,可能会更安全,因为我会更加小心,而不仅仅是依靠一个同步哈希表神奇地为我处理所有事情。
var filtered = yourHashtable.Cast<DictionaryEntry>()
                            .Where(x => ((Job)x.Value).JobSize == JobSize.Small)
                            .ToDictionary(x => (int)x.Key, x => (Job)x.Value);