我有一個以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