2011-04-25 15 views
1

我知道哈希表的Add和Assignment-Index-Indexer操作是不同的(即后者将允许覆盖,而前者抛出一个“Item已被添加。键入字典:...”异常)。我的问题是可能会出现什么情况,你想添加一些东西,但如果它已经存在,会抛出异常?C#哈希表添加与索引器 - 为什么都有?

具体来说,它似乎只是两个更多的原子操作(包含和通过索引分配)封装,我不能想出一个单一的场景,我希望微软在一个封装中处理这个办法。

编辑:我完全支持异常情况下应该抛出异常的想法,并且当给定的键已经在字典中时,添加(虽然简单地封装)提供异常。但是,通常使用哈希表和字典来快速查找从键到值。此外,大多数时候我正在创建一个,我已经有了整个集合,我只是将它翻译成字典。

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

回答

3

需要执行异常抛出行为的场景是您不希望该值存在的位置,以便在那里找到该值将会出现异常,表明出现了问题。如果你不希望密钥已经存在,那么你不需要对每个添加的元素都进行Contains测试,对吗?

+0

这里没有真实的场景 - 只是我在原始问题中提到的假设情况。有没有一个特别的场景,你真的想要这种类型的行为? – LJM 2011-04-25 20:49:00

+0

我没有一个具体的例子,但只是为了说明:你有一系列的复选框来表示键控实体,并且你想通过添加/删除相应的条目到你的散列表来响应每个复选框的点击。哈希表开始为空,复选框最初都是未选中的。当你点击时,如果复选框被选中,你可以将它添加到散列表中,如果没有选中它,你可以将其删除。 – JeffSahol 2011-04-25 20:59:26

+0

太好了。不是我通常使用哈希表或字典的东西,但我认为这是一个很好的例子。我认为这里一个很好的例子的关键是它总是在变化,而不是从一开始就建立起来的东西。谢谢。 – LJM 2011-04-25 21:10:44

1

它可能是应用程序逻辑的一部分,您添加的对象应该不在那里。如果对象已经存在,那么其他地方的代码可能会犯下编程错误。像这样的例子通常被标记为异常或断言。有一种方法可以为您提供例外,避免您必须编写如下代码:

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