C #에서 Hashtable보다 Dictionary가 선호되는 이유는 무엇입니까?


1395

대부분의 프로그래밍 언어에서 사전은 해시 테이블보다 선호됩니다. 그 이유는 무엇입니까?


21
> 반드시 그런 것은 아닙니다. 해시 테이블은 사전의 구현입니다. 그 전형적인 모습이며 .NET의 기본값 일 수도 있지만 정의상 유일한 것은 아닙니다. 이것이 ECMA 표준에 필요하다는 것을 확신하지는 않지만 MSDN 설명서 는 해시 테이블로 구현되는 것으로 명확하게 호출합니다. 대안이 더 합리적인 시간에 SortedList 클래스를 제공하기도합니다.
Promit

15
@Promit 나는 항상 Dictionary의 구현 이라고 생각 했다 Hashtable.
b1nary.atr0phy

2
그 이유는 사전에서 키의 유형과 자신의 가치를 정의 할 수 있기 때문이라고 생각합니다. Hashtable은 객체를 가져 와서 해시를 기반으로 한 쌍을 저장합니다 (object.GetHashCode ()).
라디에이터

2
@Dan 귀하의 주장은 매우 잘못되었습니다 ... 해시 테이블에는 각 키의 인스턴스가 하나만 포함되어 있으며 검색은 여러 항목을 생성하지 않습니다. 여러 값을 각 키와 연관 시키려면 해시 테이블 값을 값 목록으로 만드십시오. "사전"과 같은 데이터 구조는 없습니다. 사전은 단순히 일부 라이브러리가 해시 테이블에 사용하는 이름입니다. 예를 들어, C #의 제네릭이 아닌 해시 테이블을이라고 HashTable합니다. 언어에 제네릭을 추가하면 제네릭 버전이라고했습니다 Dictionary. 둘 다 해시 테이블입니다.
Jim Balter

3
@Dan 귀하의 주장이 잘못되었습니다 ... 해시 테이블 ( en.wikipedia.org/wiki/Hash_table )은 사전, 특정 연관 배열 ( en.wikipedia.org/wiki/Associative_array ) 의 특정 구현 이며, 사전은 각 키의 인스턴스를 하나만 포함하며 검색은 여러 항목을 생성하지 않습니다. 여러 값을 각 키와 연관 시키려면 해시 테이블 값을 값 목록으로 만드십시오. 그리고 .NET Dictionary 및 Hashtable 클래스는 모두 해시 테이블입니다.
짐 발터

답변:


1568

그만한 가치가있는 사전 (개념적으로) 해시 테이블입니다.

" Dictionary<TKey, TValue>클래스 대신 클래스를 사용하는 이유는 Hashtable무엇입니까?" 를 의미한다면 쉬운 대답 Dictionary<TKey, TValue>입니다. 일반적인 유형입니다.Hashtable 입니다. 즉 Dictionary<TKey, TValue>, 임의의 객체를 삽입 할 수 없으며 취한 값을 캐스팅 할 필요가 없기 때문에 유형 안전을 얻을 수 있습니다.

흥미롭게도 Dictionary<TKey, TValue> .NET Framework 구현 Hashtable은 소스 코드에서이 주석에서 알 수 있듯이을 기반으로합니다 .

일반 사전은 Hashtable의 소스에서 복사되었습니다.

출처


393
또한 권투 / 언 박싱이 없기 때문에 일반 컬렉션도 훨씬 빠릅니다
Chris S

6
위의 진술로 Hashtable에 대해서는 확실하지 않지만 ArrayList vs List <t>의 경우는 사실입니다.
Chris S

36
Hashtable은 Object를 사용하여 사물을 내부적으로 보유하고 (일반적이지 않은 방식으로 만) 상자 / 상자를 풀어야합니다.
Guvante

16
@BrianJ : "해시 테이블"(두 단어)은 이러한 종류의 구조에 대한 컴퓨터 과학 용어입니다. 사전은 특정 구현입니다. HashTable은 대략 약간 다른 인터페이스를 가지고 있지만 Dictionary <object, object>에 대략적으로 해당하지만 둘 다 해시 테이블 개념의 구현입니다. 물론 문제를 더 혼란스럽게하기 위해 일부 언어는 해시 테이블을 "사전"(예 : Python)이라고하지만 적절한 CS 용어는 여전히 해시 테이블입니다.
Michael Madsen

32
@BrianJ : 모두 HashTable(클래스) 및 Dictionary(클래스) 해시 테이블 (개념)입니다,하지만이 HashTable아닙니다 Dictionary,도 아니다이다 . 그것들은 매우 유사한 방식으로 사용되며 a와 동일한 형식화되지 않은 방식으로 작동 할 수 있지만 코드를 직접 공유하지는 않습니다 (부분은 매우 유사한 방식으로 구현 될 수 있음). DictionaryHashTableDictionary<Object,Object>HashTable
Michael Madsen 2016 년

625

Dictionary<<< >>> Hashtable차이점 :

  • 일반 <<< >>> 비 제네릭
  • 자체 스레드 동기화 필요 <<< >>> 메소드를 통해 스레드 안전 버전 제공Synchronized()
  • 열거 된 항목 : KeyValuePair<<< >>> 열거 된 항목 :DictionaryEntry
  • 최신 (> .NET 2.0 ) <<< >>> 이전 ( .NET 1.0 부터 )
  • System.Collections.Generic <<< >>> 인 은 System.Collections
  • 존재하지 않는 키에 대한 요청에서 예외 <<< >>> 가 발생 함 존재하지 않는 키에 대한 요청이 null을 반환 함
  • 값 유형 <<< >>>의 경우 잠재적으로 조금 더 빠름 값 유형의 경우 조금 느리게 (박싱 / 언 박싱 필요)

Dictionary/ Hashtable유사점 :

  • 둘 다 내부적으로 해시 테이블입니다 == 키에 따라 많은 항목 데이터에 빠르게 액세스
  • 둘 다 필요 불변의 고유 키 합니다
  • 둘 다의 열쇠는 자신의 GetHashCode()방법이 필요합니다

유사한 .NET 컬렉션 (사전 및 해시 테이블 대신 사용할 후보) :

  • ConcurrentDictionary- 스레드 안전 (여러 스레드에서 동시에 안전하게 액세스 가능)
  • HybridDictionary- 최적화 된 성능 (작은 품목 및 많은 품목)
  • OrderedDictionary-int 인덱스를 통해 값에 액세스 할 수 있습니다 (항목이 추가 된 순서대로)
  • SortedDictionary -아이템 자동 정렬 된
  • StringDictionary- 문자열을 강력하게 입력하고 최적화

11
@ Guillaume86, 이것이 대신 TryGetValue를 사용하는 이유 msdn.microsoft.com/en-us/library/bb347013.aspx
Trident D' Gao

2
StringDictionary... btw의 +1 은 기본 생성자를 사용할 때 StringDictionary와 다릅니다 Dictionary<string, string>.
Cheng Chen

ParallelExtensionsExtras @ code.msdn.microsoft.com/windowsdesktop/… 에는 뛰어난 전나무 바인딩 및 동시 성인 ObservableConcurrentDictionary가 포함되어 있습니다.
VoteCoffee

3
멋진 설명, 마음에 올 수있는 질문을 줄이기 위해 유사성을 나열한 것이 정말 좋습니다.
mkb


178

때문에 Dictionary일반 클래스 (이다 Dictionary<TKey, TValue>), 그 콘텐츠에 액세스되도록하는 (즉, 당신은에서 캐스트 할 필요가 없습니다 유형 안전 Object당신이와 마찬가지로, Hashtable).

비교

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

그러나 Dictionary내부적으로 해시 테이블로 구현되므로 기술적으로 동일한 방식으로 작동합니다.


88

참고 : .NET에서는 Hashtable여러 판독기 스레드와 단일 쓰기 스레드에서 사용하기에 안전한 스레드입니다.Dictionary 에 스레드 안전하지만 공용 정적 멤버는 스레드 안전하지만 모든 인스턴스 멤버는 스레드 안전을 보장하지 않습니다.

Hashtable이 때문에 모든 사전을 다시 바꿔야 했습니다.


10
장난. Dictionary <T> 소스 코드는 훨씬 깨끗하고 빠릅니다. 사전을 사용하고 자체 동기화를 구현하는 것이 좋습니다. 사전 읽기가 최신 상태 여야한다면 사전의 읽기 / 쓰기 방법에 대한 액세스를 동기화하면됩니다. 많은 잠금이 될 것이지만 정확합니다.
Triynko

10
또는 판독 값이 절대적으로 최신 상태 일 필요가없는 경우 사전을 변경할 수없는 것으로 취급 할 수 있습니다. 그런 다음 사전에 대한 참조를 가져 와서 읽기를 전혀 동기화하지 않음으로써 성능을 얻을 수 있습니다 (불변하고 본질적으로 스레드 안전하므로). 업데이트하려면 백그라운드에서 사전의 업데이트 된 전체 복사본을 구성한 다음 Interlocked.CompareExchange로 참조를 바꾸십시오 (단일 쓰기 스레드를 가정하고 여러 쓰기 스레드는 업데이트 동기화가 필요함).
Triynko

38
.Net 4.0 ConcurrentDictionary에는 모든 공개 / 보호 메소드가 스레드 안전하도록 구현 된 클래스가 추가되었습니다 . 레거시 플랫폼을 지원할 필요가없는 경우 Hashtable멀티 스레드 코드 를 대체 할 수 있습니다 . msdn.microsoft.com/en-us/library/dd287191.aspx
Dan Is Fiddling By Firelight

구조에 익명. 멋진 답변입니다.
unkulunkulu

5
필자는 테이블에서 정보가 삭제되지 않는 시나리오에서 HashTable이 독자-작성기 스레드 안전이라는 것을 읽었습니다. 독자가 다른 항목을 삭제하는 동안 테이블에있는 항목을 요청하고 해당 항목을 둘 이상의 위치에서 찾아 보려는 경우 독자가 검색하는 동안 작성자가 항목을 이동할 수 있습니다. 검사하지 않은 장소에서 검사하지 않은 장소로 인해 품목이 존재하지 않는다는 잘못된보고가 발생합니다.
supercat 2011

68

.NET에서의 차이 Dictionary<,>와는 HashTable정적 유형 검사 (감소 복싱의 측면에서 제네릭의 모든 혜택을받을 수 있도록 전자는 일반적인 유형이며, 주로이다,하지만 사람들이 생각하는 경향이 큰대로되지 않습니다 성능 측면-권투에 대한 명확한 메모리 비용이 있습니다).


34

사람들은 사전이 해시 테이블과 동일하다고 말합니다.

반드시 그런 것은 아닙니다. 해시 테이블은 사전 을 구현 하는 한 가지 방법 입니다. 그 전형적인 점이며 Dictionary클래스의 .NET에서 기본값 일 수 있지만 정의상 유일한 것은 아닙니다.

링크 된 목록이나 검색 트리를 사용하여 사전을 똑같이 잘 구현할 수 있지만 효율적이지 않습니다 (일부 메트릭의 경우 효율적).


4
MS 문서에 따르면 "사전 <(Of <(TKey, TValue>)>) 클래스가 해시 테이블로 구현되기 때문에 키를 사용하여 값을 검색하는 것이 O (1)에 매우 가깝습니다." 따라서 처리 할 때 해시 테이블을 보장해야합니다 Dictionary<K,V>. IDictionary<K,V>그래도 아무것도 될 수 있습니다 :)
snemarch

13
@ rix0rrr-나는 당신이 그것을 거꾸로 가지고 있다고 생각합니다. 사전은 HashTable을 사용하지 않고 HashTable을 사용합니다.
Joseph Hamilton

8
@JosephHamilton-rix0rrr는 "해시 테이블 사전 의 구현입니다 ." 그는 계급이 아니라 "사전"이라는 개념을 의미합니다 (소문자는 아님). 개념적으로 해시 테이블은 사전 인터페이스를 구현합니다. .NET에서 Dictionary는 해시 테이블을 사용하여 IDictionary를 구현합니다. 지저분하다;)
Robert Hensing

.NET에서 이야기하고 있었는데, 그가 대답에서 언급 한 것이기 때문입니다.
Joseph Hamilton

2
@JosephHamilton : 구현 (또는 구현 )은 원격 사용 과 동일한 것을 의미하지도 않습니다 . 정반대. "해시 테이블은 사전을 구현하는 한 가지 방법"이라고 약간 다르게 말하면 더 분명했을 것입니다. 즉, 사전의 기능을 원할 경우 사전을 구현 하는 한 가지 방법 은 해시 테이블을 사용하는 것입니다.
ToolmakerSteve

21

Collections& Generics는 객체 그룹을 처리하는 데 유용합니다. .NET에서 모든 컬렉션 개체는 인터페이스 아래에 있으며이 인터페이스 IEnumerable에는 ArrayList(Index-Value))&가 HashTable(Key-Value)있습니다. .NET 프레임 워크 2.0 후 ArrayListHashTable교환되었다 List& Dictionary. 이제 Arraylist&HashTable 는 현재 프로젝트에서 더 이상 사용되지 않습니다.

의 차이에 오는 HashTableDictionary, Dictionary로 어디 제네릭 Hastable일반 없습니다. 에 모든 유형의 객체를 추가 할 수 HashTable있지만 검색하는 동안 필요한 유형으로 캐스트해야합니다. 따라서 형식이 안전하지 않습니다. 그러나dictionary 선언하면서 키와 값의 유형을 지정할 수 있으므로 검색하는 동안 캐스트 할 필요가 없습니다.

예를 보자.

해시 테이블

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

사전,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

2
KeyValuePair에 데이터 유형을 명시 적으로 할당하는 대신 var를 사용할 수 있습니다. 따라서 이것은 입력을 줄입니다-foreach (var kv in dt) ... 그냥 제안입니다.
Ron

16

사전:

  • 존재하지 않는 키를 찾으려면 예외를 반환 / 던집니다.

  • 복싱 및 언 박싱이 없기 때문에 해시 테이블보다 빠릅니다.

  • 공개 정적 멤버 만 스레드로부터 안전합니다.

  • 사전은 일반적인 유형이므로 모든 데이터 유형과 함께 사용할 수 있습니다 (생성시 키와 값 모두에 대한 데이터 유형을 지정해야 함).

    예: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay는 해시 테이블의 형태 보증 구현, Keys그리고 Values강력하게 형식화된다.

해시 테이블 :

  • 존재하지 않는 키를 찾으려면 null을 반환합니다.

  • 복싱과 언 박싱이 필요하기 때문에 사전보다 느립니다.

  • Hashtable의 모든 멤버는 스레드로부터 안전합니다.

  • 해시 테이블은 일반적인 유형이 아닙니다.

  • Hashtable은 느슨하게 형식화 된 데이터 구조이므로 모든 유형의 키와 값을 추가 할 수 있습니다.


"존재하지 않는 키를 찾으려고하면 예외가 반환됩니다." 사용하지 않는 경우Dictionary.TryGetValue
Jim Balter

16

C #을 사용하여 데이터 구조의 광범위한 시험 MSDN의 문서에서는 차이도 존재한다고 충돌 해결 전략 :

Hashtable 클래스는 rehashing 이라는 기술을 사용합니다 .

리 해싱은 다음과 같이 작동합니다. H 1 ... H n 해시 함수 세트가 있으며, 해시 테이블에서 항목을 삽입하거나 검색 할 때 처음에는 H 1 해시 함수가 사용됩니다. 이로 인해 충돌이 발생하면 대신 H 2 가 시도되고 필요한 경우 H n 까지 진행됩니다 .

사전은 체인 이라고하는 기술을 사용합니다 .

리 해싱을 사용하면 충돌시 해시가 다시 계산되고 해시에 해당하는 새 슬롯이 시도됩니다. 그러나 체인을 사용하면 충돌을 방지하기 위해 보조 데이터 구조가 사용됩니다 . 특히 사전의 각 슬롯에는 해당 버킷에 매핑되는 요소 배열이 있습니다. 충돌이 발생하면 충돌 요소 앞에 버킷 목록이 추가됩니다.


16

.NET Framework 3.5부터는 키만 필요하고 값이없는 경우 HashSet<T>모든 장점을 제공 Dictionary<TKey, TValue>하는가 있습니다.

따라서 a를 사용 Dictionary<MyType, object>하고 항상 null유형 안전 해시 테이블을 시뮬레이트하기 위해 값을 설정하면로 전환하는 것이 HashSet<T>좋습니다.


14

Hashtable당신이 어떤 유형의 키와 값을 추가 할 수 있도록, 느슨하게 입력 된 데이터 구조입니다 Hashtable. 이 Dictionary클래스는 형식에 안전한 Hashtable구현이며 키와 값은 강력하게 형식화됩니다. Dictionary인스턴스를 생성 할 때 키와 값 모두에 대한 데이터 유형을 지정해야합니다.


11

공지 사항은 MSDN은 말한다 : "사전 <(의 <(TKEY, TValue이>)>) 클래스가로 구현 해시 테이블 "이 아닌 "<(클래스가로 구현됩니다 사전 <(TKEY, TValue>) 중>) 해시 "

Dictionary는 HashTable로 구현되지 않지만 해시 테이블의 개념에 따라 구현됩니다. 내부적으로 Microsoft는 동일한 코드를 사용하고 Object 유형의 기호를 TKey 및 TValue로 대체 할 수 있었지만 Generics를 사용했기 때문에 구현은 HashTable 클래스와 관련이 없습니다.

.NET 1.0에서는 Generics가 존재하지 않았습니다. 이것은 HashTable과 ArrayList가 처음 시작된 곳입니다.


그 MSDN 인용문을 고칠 수 있습니까? 무언가가 없거나 잘못되었습니다. 그것은 문법적이지 않으며 다소 이해할 수 없습니다.
Peter Mortensen

10

해시 테이블 :

키 / 값은 힙에 저장하는 동안 개체 (복싱) 유형으로 변환됩니다.

힙에서 읽는 동안 키 / 값을 원하는 유형으로 변환해야합니다.

이러한 작업은 매우 비용이 많이 듭니다. 우리는 가능한 한 boxing / unboxing을 피해야합니다.

사전 : HashTable의 일반 변형.

복싱 / 언 박싱이 없습니다. 전환이 필요하지 않습니다.


8

Hashtable 객체는 컬렉션의 요소를 포함하는 버킷으로 구성됩니다. 버킷은 Hashtable 내에있는 요소의 가상 하위 그룹으로, 대부분의 컬렉션에서보다 쉽고 빠르게 검색 및 검색 할 수 있습니다 .

Dictionary 클래스는 Hashtable 클래스와 기능이 동일합니다. Hashtable 의 요소가 Object 유형이므로 값 유형을 저장하거나 검색하는 경우 일반적으로 boxing 및 unboxing이 발생하기 때문에 특정 유형 (Object 이외의)의 사전은 값 유형에 대해 Hashtable보다 성능이 우수 합니다.

추가 정보 : 해시 테이블 및 사전 컬렉션 유형


7

또 다른 중요한 차이점은 Hashtable이 스레드 안전이라는 것입니다. Hashtable에는 MR / SW (Multiple Reader / Single Writer) 스레드 안전 기능이 내장되어있어 Hashtable을 사용하면 ONE writer가 잠금없이 여러 판독기와 함께 사용할 수 있습니다.

사전의 경우 스레드 안전성이 없습니다. 스레드 안전성이 필요한 경우 자체 동기화를 구현해야합니다.

더 자세히 설명하려면 :

Hashtable은 다음을 통해 스레드 안전성을 제공합니다. Synchronized 속성을 하여 컬렉션 주변의 스레드 안전 래퍼를 반환합니다. 랩퍼는 모든 추가 또는 제거 조작에서 전체 콜렉션을 잠그면 작동합니다. 따라서 컬렉션에 액세스하려는 각 스레드는 해당 차례가 하나의 잠금을 수행 할 때까지 기다려야합니다. 이는 확장 할 수 없으며 대규모 컬렉션의 경우 성능이 크게 저하 될 수 있습니다. 또한 디자인은 경쟁 조건으로부터 완전히 보호되지 않습니다.

.NET Framework 2.0 컬렉션 클래스 List<T>, Dictionary<TKey, TValue>등은 스레드 동기화를 제공하지 않습니다. 여러 스레드에서 동시에 항목을 추가하거나 제거 할 때 사용자 코드가 모든 동기화를 제공해야합니다.

스레드 안전성뿐만 아니라 형식 안전성이 필요한 경우 .NET Framework에서 동시 컬렉션 클래스를 사용하십시오. 자세한 내용은 여기를 참조하십시오 .

또 다른 차이점은 사전에 여러 항목을 추가 할 때 항목이 추가되는 순서가 유지된다는 것입니다. Dictionary에서 항목을 검색 할 때 삽입 한 순서대로 레코드를 가져옵니다. Hashtable은 게재 신청서를 보존하지 않습니다.


내가 이해 한 바에 따르면 삭제가 포함되지 않은Hashset 사용 시나리오에서 MR / SW 스레드 안전성 이 보장 됩니다 . MR / SW가 완전히 안전하기는했지만 삭제를 안전하게 처리하면 MR / SW 안전 비용이 크게 증가합니다. 무삭제 Dictionary시나리오에서 최소 비용으로 MR / SW 안전성을 제공 할 수 있었지만 MS는 무삭제 시나리오를 "특별한"것으로 취급하지 않기를 원한다고 생각합니다.
supercat

5

내가 알아낼 수있는 또 다른 차이점은 다음과 같습니다.

웹 서비스에는 Dictionary <KT, VT> (일반)를 사용할 수 없습니다. 웹 서비스 표준이 제네릭 표준을 지원하지 않기 때문입니다.


비누 기반 웹 서비스에서 일반 목록 (List <string>)을 사용할 수 있습니다. 그러나 웹 서비스에서 사전 (또는 해시 테이블)을 사용할 수 없습니다. 그 이유는 .net xmlserializer가 사전 객체를 처리 할 수 ​​없기 때문이라고 생각합니다.
Siddharth

5

Dictionary<> 제네릭 형식이므로 형식이 안전합니다.

HashTable에 모든 값 유형을 삽입 할 수 있으며 때로는 예외가 발생할 수 있습니다. 그러나 Dictionary<int>정수 값만 허용하고 마찬가지로 Dictionary<string>문자열 만 허용합니다.

따라서 Dictionary<>대신에 사용하는 것이 좋습니다 HashTable.


0

대부분의 프로그래밍 언어에서 사전은 해시 테이블보다 선호됩니다.

나는 이것이 사실이라고 생각하지 않는다. 대부분의 언어는 그들이 선호 하는 용어 에 따라 하나 또는 다른 언어를 가진다 .

그러나 C #에서 분명한 이유는 C # HashTables와 System.Collections 네임 스페이스의 다른 멤버가 거의 사용되지 않기 때문입니다. 그들은 C # V1.1에 존재했습니다. C # 2.0에서 System.Collections.Generic 네임 스페이스의 Generic 클래스로 대체되었습니다.


사전에 비해 해시 테이블의 장점 중 하나는 사전에 키가 없으면 오류가 발생한다는 것입니다. 해시 테이블에 키가 없으면 null 만 반환합니다.
Bill Norman

C #에서는 제네릭의 이점이 없으므로 System.Collections.Hashtable을 사용하지 마십시오. 키의 존재 여부를 모르는 경우 Dictionary의 TryGetValue 또는 HasKey를 사용할 수 있습니다.
kristianp

HasKey가 아닌 으아, ContainsKey 여야합니다.
kristianp

-3

.NET Reflector 를 사용하여 내가 본 것에 따르면 :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

따라서 DictionaryBase가 내부적으로 HashTable을 사용하는지 확인할 수 있습니다.


16
System.Collections.Generic.Dictionary <TKey, TValue>는 DictionaryBase에서 파생되지 않습니다.
snemarch

"따라서 DictionaryBase가 내부적으로 HashTable을 사용하는지 확인할 수 있습니다." -그것은 좋지만 질문과 관련이 없습니다.
짐 발터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.