将hashtable.Keys转换为List 或其他IEnumerable
我知道,我有其他选择,例如我可以维护一个单独的键列表。 请不要提出其他选择。 我只是想知道我是否可以解决这个问题。 请不要问我正在尝试解决的问题,或类似的问题。 这是一个纯粹而简单的CS问题。
我想知道是否有人知道从Hashtable
获取密钥的方法并将它们转换为List
或其他类型的IEnumerable
(当然,我的密钥实际上是整数)。
鉴于我可以毫无问题地做到这一点:
foreach (int key in hashtable.Keys)
为什么这会给我带来错误?
(List)hashtable.Keys
如果您有可用的LINQ扩展方法,则可以执行以下操作。
List keys = hashtable.Keys.Cast ().ToList();
也
List keys = hashtable.Keys.OfType ().ToList();
可能会工作取决于自动拳击
因为foreach
需要hashtable.Keys
是一个IEnumerable
,它就是。 但是, hashtable.Keys
不是List
; 这是一个简单的ICollection,这是不一样的。 要将其转换为List,请尝试一些Linq:
List keys = hashtable.Keys.OfType ().ToList();
这将基本上通过Keys集合进行枚举,并将每个元素添加到新的List中,然后为您提供List。 OfType()比Cast更“安全”; Cast只是尝试将整个集合视为IEnumerable
,如果任何包含的元素为null或者不能隐式转换为整数,则可能导致运行时错误或不可预测的行为。 相反,OfType将遍历源并生成只有实际为int的元素的可枚举。 如果您确定所有键都是整数,则可以正常工作。
因为hashtable.Keys
是一组对象,它与整数列表不协变。
你可以做ICollection
使用Dictionary而不是非generics版本。 或者使用CastTo扩展方法。 有关Hastable.Key返回的非generics集合的详细信息以及可以使用的强制转换方法的链接,请参阅http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx 。
如果Keys
集合不包含int
则foreach
循环将抛出InvalidCastException
。
转换为List
失败,因为编译器无法将非genericsICollection
转换为特定的ICollection