将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 keyCols = hashtable.Keys;

使用Dictionary而不是非generics版本。 或者使用CastTo扩展方法。 有关Hastable.Key返回的非generics集合的详细信息以及可以使用的强制转换方法的链接,请参阅http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx 。

如果Keys集合不包含intforeach循环将抛出InvalidCastException

转换为List失败,因为编译器无法将非genericsICollection转换为特定的ICollection