2011-04-25 61 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