2010-06-20 78 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); 
相關問題