【问题标题】:C# Hashtable Add vs Indexer - Why have both?C# Hashtable Add vs Indexer - 为什么两者都有?
【发布时间】:2011-04-25 20:21:47
【问题描述】:

我知道哈希表的 Add 和 assignment-via-indexer 操作是不同的(即后者将允许覆盖而前者抛出“项目已添加。在字典中键入:...”异常) .我的问题是,在什么情况下你会想要添加一些东西,但如果它已经存在则抛出异常?

具体来说,这似乎只是对另外两个原子操作(包含和通过索引器分配)的封装,我无法想出一个单一的场景来让微软以封装的方式处理这个问题.

编辑:我完全支持异常情况应该抛出异常的想法,并且当给定键已经在字典中时,Add(虽然只是一个封装)提供异常。但是,通常 Hashtables 和 Dictionaries 用于从键到值的快速查找。此外,大多数时候,当我构建一个时,我已经拥有了整个集合,我只是将它翻译成字典。

我刚刚举了一个例子……我可以想象一个场景,您使用哈希表(或字典)来跟踪登录到特定会话的用户的会话。如果您有一个特定要求,即每个用户一次只能从一个位置登录(并且他们必须在再次登录之前退出一个会话),那么您可能需要 Add,因为它更清楚地定义了代码。

【问题讨论】:

    标签: c# hashtable


    【解决方案1】:

    需要抛出异常行为的场景是您不希望该值存在,因此发现它存在异常,表明出现问题。如果您从未期望密钥已经存在,您不会希望对每个添加的元素都进行 Contains 测试,对吗?

    【讨论】:

    • 这里没有真实的场景 - 只是我在原始问题中提到的假设情况。是否存在您真正想要这种行为的特定场景?
    • 我没有具体的例子,只是为了说明:您有一系列复选框来表示键控实体,并且您希望通过添加/删除来响应对每个复选框的单击您的哈希表的相应条目。哈希表一开始是空的,复选框最初都是未选中的。当您响应单击时,如果选中复选框,则将其添加到哈希表中,如果未选中则将其删除。
    • 太棒了。我通常不会使用哈希表或字典,但我认为这是一个很好的例子。我认为这里的一个好例子的关键是它总是在变化,而不是你从一开始就构建的东西。谢谢。
    【解决方案2】:

    您要添加的对象不应该已经存在,这可能是应用程序逻辑的一部分。如果对象已经存在,则可能在其他地方的代码中提交了编程错误。像这样的情况通常用异常或断言来标记。拥有一个为您引发异常的方法可以避免您编写如下代码:

    if 'key' in my_dict:
        raise ProgrammingErrorElsewhere()
    my_dict['key'] = obj
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2019-05-09
      • 2020-08-11
      • 2018-03-01
      • 2010-12-12
      • 2012-11-24
      • 1970-01-01
      相关资源
      最近更新 更多