2013-04-24 2 views
0

TryGetValue를 사용하여 내 사전에 데이터를 추가/대체했습니다. new를 추가하는 것과 old를 대체하는 것의 구분을하기 위해 []와 .Add()를 모두 사용합니다.필자도 모두 Dictionary.TryGetValue를 사용해야합니까? 값을 추가/바꾸기 만하면됩니까?

private Dictionary<Foo, Bar> dictionary = new Dictionary<Foo, Bar>(); 

public void Update(Foo foo) 
{ 
    Bar bar; 
    if (dictionary.TryGetValue(foo, out bar) 
    { 
     dictionary [foo] = bar; 
    } 
    else 
    { 
     dictionary .Add(foo, bar); 
    } 
} 

실제로 검색된 값이 아무것도 아냐, 난 위를 교체하지 말아야 이유가있다 : 이것은 내가 실제로 검색 값으로 아무것도하고 있지 않다 경우, 다음과 같은 코드에 이르게 이 코드는? :

public void Update(Foo foo) 
{ 
    dictionary[foo] = bar; 
} 

감사합니다.

+0

_ "위의 코드를이 코드로 바꾸면 안되는 이유가 있을까요?"_ ** No ** ('bar'가 선언되지 않았고 초기화되지 않은 것을 제외하고) –

+1

'var item = dictionary [foo]'는 키가 존재하지 않으면 예외를 던질 것이기 때문에 ('Hashtable'과는 다르게) 누락 된 키에 대해 null이 생길 것을 기대하면서 역순으로 처리합니다. –

+0

두 번째'Update (Foo foo)'메소드에서'bar' 란 무엇입니까? –

답변

5

간단한 코드를 사용해야합니다.
모든 경우에서 더 빠를 것입니다. (하나의 해시 검색 대 2)

더 중요한 것은 더 간단합니다.

+1

하지만 의미가 동일하지 않음 ('KeyNotFoundException' 가능) –

+2

@lukas 의미는 대체 코드 샘플과 동일하므로'KeyNotFoundException '도 발생시키지 않으므로이 경우 간단한 코드가 정확히 동일한 결과를 얻습니다 . –

+1

@lukas : 어느 쪽이나'KeyNotFoundException'을 던질 수 없습니다. –

4

아니요 짧은 코드를 사용하지 않아도됩니다.
훨씬 간단하고 우리 모두가 알고 있기 때문에 실제로 사용해야합니다.
간단한 코드는 오류가 적다는 것을 의미합니다.

+0

그 가치가 컬렉션에 있다는 것은 당연한 것이다. 메서드에서 try ..가 제거되면 논리가 모두 변경됩니다. 메서드가 업데이트 중이기 때문에 키가 있는지 여부도 확인하고 있기 때문입니다. – Marco

+0

@Marco 인덱서의 setter가 누락 된 경우 키와 값을 추가하거나 키가 있으면 값을 업데이트합니다. –

+0

@Marco : 제발 가서 [documentation] (http://msdn.microsoft.com/en-us/library/9tee9ht2.aspx)를 읽으십시오. 중요한 부분은 다음과 같습니다. "지정된 키를 찾을 수없는 경우 [...] 집합 연산은 지정된 키를 사용하여 새 요소를 만듭니다." –