동일한 유형의 KeyValuePair 목록과 사전의 차이점은 무엇입니까? 둘 중 하나를 사용하기에 적절한 시간이 있습니까?
동일한 유형의 KeyValuePair 목록과 사전의 차이점은 무엇입니까? 둘 중 하나를 사용하기에 적절한 시간이 있습니까?
답변:
키에 대한 빠른 조회가 필요하지 않은 경우-에서 사용하는 해시 테이블을 유지하면 Dictionary
특정 오버 헤드가 발생합니다.
사전은 키-값 쌍의 모음을 포함하는 일반 유형 입니다. 사전은 내부적으로 해시 함수를 사용 하기 때문에 조회 작업에 빠릅니다 . 즉, 모든 키는 dictionary에서 고유해야합니다 .
다음 예를 고려하십시오.
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
따라서 항상 최소한 두 가지를 고려해야합니다.
목록은 항목의 순서에 관심이있을 때도 유용합니다.
Phillip Ngan의 대답, SOAP 또는 기타 외에도 IDictionary를 구현하는 객체를 XML 직렬화 할 수 없습니다.
Q : 해시 테이블을 직렬화 할 수없는 이유는 무엇입니까?
A : XmlSerializer는 IDictionary 인터페이스를 구현하는 클래스를 처리 할 수 없습니다. 이것은 부분적으로는 일정 제약 때문이고 부분적으로는 해시 테이블이 XSD 유형 시스템에 대응하는 부분이 없다는 사실 때문입니다. 유일한 해결책은 IDictionary 인터페이스를 구현하지 않는 사용자 지정 해시 테이블을 구현하는 것입니다.
Silverlight 용 SOAP 웹 서비스에서 Dictionary가 직렬화되지 않음을 발견했습니다. 이것은 사전에 KeyValuePair 목록을 사용하는 상황입니다.
.
에서 http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
vs.DictionaryEntry
[Krzysztof Cwalina]우리의 구현에 문제가 논의
IEnumerable
에Dictionary<K,V>
. 어떤 유형을IEnumerable.GetEnumerator().Current
반환 해야 합니까?KeyValuePair<K,V>
또는DictionaryEntry
? 동일에 대한ICollection.CopyTo
. 어떤 유형의 인스턴스를 어레이에 복사해야합니까?우리는 다음을 결정했다
IEnumerable
및ICollection
인터페이스 구현을 사용할KeyValuePair<K,V>
항목 유형으로.IDictionary
특정 구성원 (GetEnumerator
반환IDictionaryEnumerator
)은DictionaryEntry
항목 유형으로 사용 됩니다.그 이유는 우리가
IEnumerator<T>
확장 할 곳 을 변경하는 과정에 있기 때문입니다IEnumerator
.Dictionary<K,V>
->IEnumerable<T>
-> 에서 계층 구조를 걷다가IEnumerable
갑자기 열거 자에서 반환 된 항목의 유형을 변경하면 매우 이상 할 것 입니다.