2011-03-08 58 views
8

我知道,我有其他選擇,例如我可以維護一個單獨的鍵列表。請不要建議其他選項。我只是想知道我是否可以解決這個問題。請不要問我想要解決什麼問題,或者類似的問題。這是一個純粹而簡單的CS問題。Cast a hashtable.Keys into List <int> or other IEnumerable <int>

我想知道是否有人知道如何從Hashtable中獲取密鑰並將它們投射到List<int>或某種其他類型的IEnumerable<int>(當然,假設我的密鑰實際上是整數)。

既然我可以毫無問題做到這一點:

foreach (int key in hashtable.Keys) 

爲什麼這個給我的錯誤?

(List<int>)hashtable.Keys 
+0

你可以發佈例外嗎? – Brosto 2011-03-08 17:35:53

回答

16

如果您有可用,你可以做以下LINQ擴展方法..

List<int> keys = hashtable.Keys.Cast<int>().ToList(); 

而且

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

可能因自動裝箱工作

+1

+1。具體原因是'Keys'是一個'ICollection',它只實現'IEnumerable',而不是'IEnumerable '。 – 2011-03-08 17:38:29

+1

另請注意,由於OP要求「其他'IEnumerable ',」您可以放棄'ToList',只需鍵入變量爲IEnumerable (或'var')。 – 2011-03-08 17:40:01

+0

@Adam Robinson良好的電話,也謝謝你的解釋,我現在是一個僞劣的連接,編輯我的答案有點痛苦,所以我會讓OP順從你的意見以獲得更多信息。 – 2011-03-08 17:42:25

0

因爲hashtable.Keys是未與整數列表協變的對象的集合。

+1

如果我們要分割頭髮,協方差不是明確要求的;可兌換性。 – 2011-03-08 17:41:50

-1

foreach環路將拋出InvalidCastException如果Keys集合不包含int

,因爲編譯器不能轉換爲非通用ICollection到特定ICollection<T>

+0

轉換失敗,因爲Keys不是可以像使用List一樣使用的類型;它是一個ICollection,它是一個非常基本的接口,不會公開List上可用的方法。 – KeithS 2011-03-08 17:40:02

1

因爲foreach要求hashtable.Keys是一個IEnumerable<TKey>,它是將強制轉換爲List<int>失敗。但是,hashtable.Keys不是List<TKey>;這是一個簡單的ICollection,這是不一樣的。將其轉換爲一個列表,嘗試一些LINQ的:

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

這將通過領取鑰匙基本上列舉每個元素添加到一個新的列表,然後給你的列表中。 OfType()比Cast更「安全」; Cast只嘗試將整個集合視爲IEnumerable<int>,如果包含的元素爲null或不能隱式轉換爲整數,則會導致運行時錯誤或不可預知的行爲。相比之下,OfType將迭代源代碼並僅生成實際爲整數的元素的枚舉。如果你確定所有的鍵都是整數,那麼它們都可以工作。

+0

'foreach'需要'IEnumerable',而不是'IEnumerable '。 – 2011-03-08 17:38:58

+0

從技術上講是的,但如果該枚舉是強類型的,則需要將該項變量定義爲該類型的類型(或者可以隱式轉換爲的類型);如果您嘗試執行類似於foreach(在MyCollectionOfReferenceTypes中的int id),則會出現編譯器錯誤 – KeithS 2011-03-08 18:07:07

0

你可以做ICollection<int> keyCols = hashtable.Keys;

相關問題