2010-05-11 2 views
2
Dictionary<string, int> testdic = new Dictionary<string, int>(); 
testdic.Add("cat", 1); 
testdic.Add("dog", 2); 
testdic.Add("rat", 3); 
testdic.Remove("cat"); 
testdic.Add("bob", 4); 

사전을 채운 다음 첫 번째 요소를 제거하십시오. 그런 다음 새 요소를 추가하십시오. Bob은 끝 대신에 위치 1에 나타나므로 제거 된 항목을 기억하고 해당 메모리 공간을 다시 사용하는 것 같습니다.사전의 언급되지 않은 기능은 무엇입니까?

MSDN에서 볼 수 없기 때문에 어디서나 문서화되어 있으며, 마지막에 계속 추가 할 것이라고 생각하여 슬픔의 날을 초래했습니다.

답변

15

구현 세부 사항이므로 설명하지 않습니다.

구현은 언제든지 변경 될 수 있습니다. (소스 코드를 면밀히 검토하지 않았다면 현재 구현에 대한 가정이 정확한지조차 확신 할 수 없습니다.)

Dictionary<K,V> 유형은 요소를 특정 순서로 저장하는 것을 보장하지 않으며 당신은 당신이 관찰하는 어떤 문서화되지 않은 행동에 의존해서는 안됩니다. 사전은 키에서 값까지의 맵으로 이 아니며은 정렬 된 목록입니다. MSDN documentation 가입일

는 :

열거 목적

... [t] 그 주문 상품 반품 된은 정의되지 않는다.

+0

키를 사용하여 데이터를 검색하기 위해 사전을 사용하기 때문에이 점을 강조하는 것이 중요하다고 느낍니다. 그것이 당신이 가지고있는 유일한 사용법입니다. 다른 것들이 필요하다면 (iterating하는 것과 같이) 아마도 다른 구조를 사용해야합니다. – Blindy

+0

IMHO, Microsoft는 'Dictionary'의 열거 순서가 키가 삭제되지 않은 인스턴스 (및 인스턴스 만)에 대해 정의되어 있음을 문서화해야합니다. 제한된 사용 시나리오에서 그러한 보증을지지하는 것은 비용이 많이 들지 않지만, 사전이 역 직렬화 된 표현을 정의하기 위해 그 패턴과 일치하는 방식으로 사전에 코드를 실용적으로 만들 것이므로 사전을 역 직렬화하고 다시 재 배열함으로써 얻어지는 데이터 스트림이 원본과 일치합니다. – supercat

3

사전은 정렬되지 않으므로 요소의 순서에 대해서는 절대 고려하지 않아야합니다.

구현이 가장 효율적일 수 있습니다. 이것은 현재의 구현이 당신이보고있는 행동을 보여줄 수 있음을 의미합니다. 그러나 그렇게하는 것이 문서화되어 있지 않으므로 그 내용에 의존해서는 안됩니다.

관련 문제