【问题标题】:Cast a hashtable.Keys into List<int> or other IEnumerable<int>将 hashtable.Keys 转换为 List<int> 或其他 IEnumerable<int>
【发布时间】:2011-07-11 07:14:52
【问题描述】:

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

我想知道是否有人知道从Hashtable 获取密钥并将它们转换为List&lt;int&gt; 或其他类型的IEnumerable&lt;int&gt; 的方法(当然,鉴于我的密钥实际上是整数) .

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

foreach (int key in hashtable.Keys)

为什么这会给我错误?

(List<int>)hashtable.Keys

【问题讨论】:

    标签: c# hashtable key


    【解决方案1】:

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

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

    还有

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

    可能取决于自动装箱

    【讨论】:

    • +1。具体原因是Keys是一个ICollection,它只实现了IEnumerable,而不是IEnumerable&lt;T&gt;
    • 另请注意,由于 OP 要求输入“其他IEnumerable&lt;int&gt;”,您可以放弃ToList,只需将变量键入为IEnumerable&lt;int&gt;(或var)。
    • @Adam Robinson 好电话,也感谢您添加解释,我目前处于劣质连接状态,编辑我的答案有点痛苦,所以我会让 OP 推迟到您的 cmets 以获取更多信息.
    • 谢谢!我误解了Cast&lt;T&gt;() 方法的描述。出于某种原因,我认为类型参数是集合的类型而不是元素的类型。不读书是我的错! :)
    【解决方案2】:

    因为foreach 要求hashtable.KeysIEnumerable&lt;TKey&gt;,它就是这样。但是,hashtable.Keys 不是List&lt;TKey&gt;;它是一个简单的ICollection,这是不一样的。要将其转换为列表,请尝试一些 Linq:

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

    这将基本上枚举Keys集合并将每个元素添加到一个新的List中,然后给你这个List。 OfType() 比 Cast 更“安全”; Cast 只是尝试将整个集合视为 IEnumerable&lt;int&gt;,如果任何包含的元素为 null 或无法隐式转换为整数,这可能会导致运行时错误或不可预知的行为。相比之下,OfType 将遍历源并仅生成实际上是 int 的元素的可枚举。如果您确定所有键都是整数,则任何一种方法都有效。

    【讨论】:

    • foreach 需要IEnumerable,而不是IEnumerable&lt;T&gt;
    • 技术上是的,但是如果该枚举是强类型的,则需要将 item 变量定义为该类型(或可以隐式转换为的类型);如果您尝试执行 foreach(int id in MyCollectionOfReferenceTypes) 之类的操作,则会出现编译器错误
    【解决方案3】:

    因为hashtable.Keys 是一个不与整数列表协变的对象集合。

    【讨论】:

    • 如果我们要分裂头发,协方差不是明确要求的;可兑换性是。
    【解决方案4】:

    你可以ICollection&lt;int&gt; keyCols = hashtable.Keys;

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果Keys 集合不包含int,您的foreach 循环将抛出InvalidCastException

        转换为List&lt;int&gt; 失败,因为编译器无法将非泛型ICollection 转换为特定ICollection&lt;T&gt;

        【讨论】:

        • 强制转换失败,因为 Keys 不是可以像 List 一样使用的类型;它是一个 ICollection,它是一个非常基本的接口,它不公开 List 上可用的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 2018-04-28
        • 1970-01-01
        • 2013-01-01
        相关资源
        最近更新 更多