2011-04-25 6 views
1

해시 테이블의 추가 및 할당 대 인덱서 작업이 서로 다르다는 것을 알고 있습니다. 즉, 후자는 "항목이 이미 추가되었습니다. 사전에 키 추가 : ..."예외가 발생하는 동안 덮어 쓰기를 허용합니다. 제 질문은 당신이 무언가를 추가하고 싶지만 이미 예외가 있다면 어떤 상황이 발생할 수 있는지입니다.C# Hashtable 대 인덱서 추가 - 두 가지 이유는 무엇입니까?

특히 이것은 두 개의 원자 적 연산 (Contains와 assignment-by-indexer)의 캡슐화 일 뿐이며 Microsoft가 캡슐화 된 방식으로이 문제를 처리하기를 원하는 단일 시나리오를 만들 수없는 것 같습니다. 방법.

편집 : 예외적 인 경우 예외를 throw해야한다는 생각을 완전히지지하며, 주어진 키가 이미 사전에있을 때 Add (단순히 캡슐화하는 동안)가 예외를 제공합니다. 그러나 일반적으로 Hashtable 및 Dictionaries는 키에서 값까지 빠른 검색에 사용됩니다. 또한, 제가 건물을 짓고있는 대부분의 시간에는 이미 전체 컬렉션을 사용할 수 있으며 단순히 사전으로 번역하고 있습니다.

예를 들어서 ... 특정 세션에 로그인 한 사용자의 세션을 추적하기 위해 해시 테이블 (또는 사전)을 사용하는 시나리오를 상상할 수 있습니다. 또한 각 사용자가 한 번에 한 위치에서만 로그인 할 수있는 특정 요구 사항이있는 경우 (다시 로그인하기 전에 하나의 세션에서 로그 아웃해야 함) 필요한 경우에는 추가하려는 것이 좋습니다. 코드.

답변

3

예외를 throw하는 동작이 바람직한 시나리오는 예외가 발생했음을 예상 할 수 있도록 값이 예상되는 곳입니다. 키가 이미있을 것으로 예상하지 않는다면 추가 된 모든 요소에 대해 Contains 테스트를 수행하고 싶지 않을 것입니다.

+0

여기에는 실제 시나리오가 없습니다. 원래 질문에서 언급 한 가상의 상황은 없습니다. 이 유형의 행동을 실제로 원했던 특정 시나리오가 있습니까? – LJM

+0

구체적인 예로는 일러스트레이션이 아닙니다. 일러스트레이션을 위해 : 표시된 키 엔티티에 대한 일련의 확인란이 있으며 해시 테이블에 해당 항목을 추가/제거하여 각 확인란의 클릭에 응답하고 싶습니다 . 해시 테이블은 비어있는 채로 시작하고 체크 박스는 처음에는 모두 선택 해제됩니다. 클릭에 응답 할 때 확인란이 선택되어 있으면 해시 테이블에 추가하고 선택하지 않으면 제거합니다. – JeffSahol

+0

좋아요. 일반적으로 해시 테이블이나 사전을 사용하지는 않지만 좋은 예라고 생각합니다. 여기서 좋은 본보기의 열쇠는 항상 변화하고있는 것, 처음부터 만들어 나가는 것이 아니라는 것입니다. 감사. – LJM

1

추가하려는 객체가 이미 존재하지 않아야한다는 것은 응용 프로그램 논리의 일부일 수 있습니다. 객체가 이미 존재하는 경우 프로그래밍 오류가 다른 곳의 코드에서 발생했을 수 있습니다. 이러한 경우에는 일반적으로 예외 또는 어설 션으로 플래그가 지정됩니다. 예외를 발생시키는 방법을 사용하면 다음과 같은 코드를 작성하지 않아도됩니다.

if 'key' in my_dict: 
    raise ProgrammingErrorElsewhere() 
my_dict['key'] = obj 
관련 문제