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