언제 Dictionary <T1, T2> 대신 List <KeyValuePair <T1, T2 >>를 사용합니까?


95

동일한 유형의 KeyValuePair 목록과 사전의 차이점은 무엇입니까? 둘 중 하나를 사용하기에 적절한 시간이 있습니까?

답변:


80

키에 대한 빠른 조회가 필요하지 않은 경우-에서 사용하는 해시 테이블을 유지하면 Dictionary특정 오버 헤드가 발생합니다.


9
또한 목록 삽입 작업은 사전에있는 작업보다 더 빠릅니다
Vadym Stetsiak 2009

2
해당 필드는 읽기 전용이지만 목록의 전체 요소를 언제든지 바꿀 수 있습니다.
Pavel Minaev


62

요컨대, 목록은 키의 고유성을 강제하지 않으므로 해당 의미가 필요한 경우 사용해야합니다.


7
+1 사전은 값의 고유성을 강제하지 않습니다!
gdoron 모니카 지원하고

25

사전은 키-값 쌍의 모음을 포함하는 일반 유형 입니다. 사전은 내부적으로 해시 함수를 사용 하기 때문에 조회 작업에 빠릅니다 . 즉, 모든 키는 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.

따라서 항상 최소한 두 가지를 고려해야합니다.

  1. 사전에서 구체적인 항목을 검색 하시겠습니까?
  2. 일부 필드가 고유하지 않게 하시겠습니까 (예 : 쌍 : 이름 / 성).

1
여기서 요점은 사전 키가 고유해야하며 List <KeyValuePair> 키가 고유하지 않아야한다는 것입니다.
브루노 Bieri

5
@BrunoBieri List <KeyValuePair> 키 고유하지 않을 수 있습니다.
Nikhil

2
2 년 전의 댓글을 수정했는데 그 점을 눈치 챘습니다. SO가 유일하게 신뢰할 수 있고 가장 인기있는 Q & A 플랫폼 인 이유는 당연합니다.
Nikhil Vartak 17.06.06


7

Phillip Ngan의 대답, SOAP 또는 기타 외에도 IDictionary를 구현하는 객체를 XML 직렬화 할 수 없습니다.

Q : 해시 테이블을 직렬화 할 수없는 이유는 무엇입니까?

A : XmlSerializer는 IDictionary 인터페이스를 구현하는 클래스를 처리 할 수 ​​없습니다. 이것은 부분적으로는 일정 제약 때문이고 부분적으로는 해시 테이블이 XSD 유형 시스템에 대응하는 부분이 없다는 사실 때문입니다. 유일한 해결책은 IDictionary 인터페이스를 구현하지 않는 사용자 지정 해시 테이블을 구현하는 것입니다.

여기에서


5

Silverlight 용 SOAP 웹 서비스에서 Dictionary가 직렬화되지 않음을 발견했습니다. 이것은 사전에 KeyValuePair 목록을 사용하는 상황입니다.

.


3

에서 http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairvs. DictionaryEntry
[Krzysztof Cwalina]

우리의 구현에 문제가 논의 IEnumerableDictionary<K,V>. 어떤 유형을 IEnumerable.GetEnumerator().Current 반환 해야 합니까? KeyValuePair<K,V>또는 DictionaryEntry? 동일에 대한 ICollection.CopyTo. 어떤 유형의 인스턴스를 어레이에 복사해야합니까?

우리는 다음을 결정했다 IEnumerableICollection인터페이스 구현을 사용할 KeyValuePair<K,V>항목 유형으로. IDictionary특정 구성원 ( GetEnumerator반환 IDictionaryEnumerator)은 DictionaryEntry항목 유형으로 사용 됩니다.

그 이유는 우리가 IEnumerator<T>확장 할 곳 을 변경하는 과정에 있기 때문입니다 IEnumerator. Dictionary<K,V>-> IEnumerable<T>-> 에서 계층 구조를 걷다가 IEnumerable 갑자기 열거 자에서 반환 된 항목의 유형을 변경하면 매우 이상 할 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.