将hashtable.Keys转换为List <int>或其他IEnumerable <int> </int> </int>

时间:2011-03-08 17:32:21

标签: c# hashtable key

我知道,我有其他选择,例如我可以维护一个单独的键列表。请不要提出其他选择。我只是想知道我是否可以解决这个问题。请不要问我我要解决的问题是什么,或类似的问题。这是一个纯粹而简单的CS问题。

我想知道是否有人知道如何从Hashtable获取密钥并将其转换为List<int>或其他类型的IEnumerable<int>(当然,我的键实际上是整数。)

鉴于我可以毫无问题地做到这一点:

foreach (int key in hashtable.Keys)

为什么这会给我带来错误?

(List<int>)hashtable.Keys

6 个答案:

答案 0 :(得分:18)

如果您有可用的LINQ扩展方法,则可以执行以下操作..

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

另外

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

可能会起作用,取决于自动装箱

答案 1 :(得分:1)

因为foreach要求hashtable.KeysIEnumerable<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>