.net에서 OrderedDictionary의 일반적인 구현이없는 이유는 무엇입니까?


26

Microsoft가 OrderedDictionary의 일반적인 구현을 제공하지 않은 이유는 무엇입니까?

내가 본 몇 가지 사용자 정의 구현이 있습니다. http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

그러나 왜 Microsoft가 기본 .net 라이브러리에 포함시키지 않았습니까? 분명히 그들은 제네릭을 만들지 않은 이유가 있었지만 ... 무엇입니까?

이 메시지를 게시하기 전에 https://stackoverflow.com/questions/2629027/no-generic-implementation-of-orderdictionary를 보았습니다.

그러나 그것은 존재하지 않는다는 것을 확인합니다. 아니 이 존재하지 않습니다.

감사


2
항상 존재 SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel

2
SortedDict 문서를 오해하지 않는 한, 그것은 내가 원하는 것이 아닙니다. 정렬을 원하지 않습니다. 키로 액세스 할 수있는 배열을 원합니다. 어쨌든 MS가 왜 이것을 건너 뛰었는지 궁금합니다. (미묘한 문제 등)
nonot1

정렬 된 사전의 일반적인 사용 사례는 무엇입니까? 나는 내 머리 꼭대기에서 하나를 생각하기 위해 고심하고 있습니다.
Carson63000

1
@Carson 언제든지 빠른 임의 액세스가 필요한 데이터 항목 배열이 있습니다. 단순히 Dict에 저장하려면 주문 정보가 손실되고 배열을 사용하려면 자체 색인을 유지해야합니다.
nonot1

2
Eric Lippert에게 질문을 읽고 답변하도록 요청하십시오. 그는 일반적으로 이러한 유형의 질문을 돕는 데 매우 동의합니다. 나는 당신이 그의 블로그를 통해 그에게 연락 할 수 있다고 생각합니다 : blogs.msdn.com/b/ericlippert
devuxer

답변:


17

에서 C # 4.0에서 간단히 말해서 나는이 읽기 :

  1. OrderedDictionary의 조합 HashTableArrayList
  2. 일반이 없습니다 ArrayList
  3. "비 제네릭 ArrayList클래스는 주로 Framework 1.x와의 호환성을 위해 사용됩니다 ..."
  4. " ArrayList기능적으로 유사하다 List<object>"
  5. "비 제네릭 ArrayList을 사용하면 List<object>"

결론?

어떤 일반 OrderedDictionary이 기본 있기 때문에 구조에는 일반 버전 자체가없는 (비공식적으로) 감가 상각 클래스입니다.


4
이것은 실제로 질문에 대답하지 않습니다. 제네릭 OrderedDictionary는 제네릭 사전과 제네릭 목록에 구축 될 수 있습니다.
JacquesB

클래스 사용의 한 가지 교훈은 구현에 관심이있는 사람이 UI를 변경하지 않는 경우입니다. 언어 설계 / 컴파일러 팀 은 제네릭이 아닌 제네릭을 상속하는 제네릭을 선호 할 수 있습니다 . 내 욕심이 흔들린다. 우선 : 다른 (즉시) 조상들이 공분산과 대조 분산 의 진화 경로에있는 지뢰 인가OrderedDictionary ?
radarbob

15

OrderedDictionary과부하 인덱싱 작업 때문에 정수와 인덱싱 N위치에 항목을 얻을 것이다 N,으로 인덱싱하는 동안 Object해당 개체에 풀어서 항목을 검색합니다. OrderedDictionary<int, string>호출 된 을 만들고 myDict항목 (1, "George") 및 (0, "Fred")를 순서대로 추가하려면 myDict[0]"George"또는 "Fred"를 반환 해야 합니까?

이러한 문제는 키 유형에 클래스 제약 조건을 적용하여 해결할 수 있습니다. 반면에 일반 컬렉션의 유용성은 가치 유형을 효율적으로 처리 할 수있는 능력에서 비롯됩니다. 키 유형에 클래스 제약 조건을 적용하면 약간 추한 것처럼 보입니다.

클래스가 CLS를 준수하지 않아도 vb.net과 함께 작동해야한다면 명명 된 인덱스 속성을 사용하는 것이 합리적이었습니다. 따라서 위의 예에서 myDict.ByKey[0]"Fred"를 myDict.BySequence[0]산출하고 "George"를 산출했을 것입니다. 불행히도 C #과 같은 언어는 명명 된 인덱스 속성을 지원하지 않습니다. 하나는 심지어 속성없이 위 구문의 사용을 허용하는 kludged 뭔가를 할 수 있지만, 불행한 결정은 같은 구조의 필드를 포장하는 PointRectangle에 대한 것을 수단을 myDict.ByKey[0] = "Wally"하려면 myDict.ByKey새로운 클래스의 객체를 반환해야합니다. 구조체는 더 효율적이지만 컴파일러는 읽기 전용 구조에 대한 쓰기처럼 보이는 것을 거부합니다 (속성이 속성이 반환 한 구조체를 수정하지는 않더라도)ByKey참조가있는 컬렉션을 수정하십시오.

개인적으로, 나는 삽입 순서를 추적하도록 지정된 사전 같은 객체가 좋은 것이라고 생각합니다. 또한 특정 키와 관련된 키를 쉽게 반환 할 수있는 사전 -ish 객체를 갖고 싶습니다 (예 : 대소 문자를 구분하지 않는 사전이 있고 키가 "GEORGE"인 레코드를 추가 한 경우 KeyValuePair열거에 반환 된 모든 객체 를 검색하지 않고도 사전에 "George"와 관련된 키를 요청할 수 있습니다.


3

순서를 유지하면 추가 / 제거 성능이 떨어지고 메모리 사용량이 증가하는 두 컬렉션 (주문 용, 검색 용)을 래핑하지 않는 한 IDictionary가 암시하는 O (1) 조회를 방지 할 수 있습니다. 또는 메모리 사용량을 줄이기 위해 검색 속도가 느려질 수 있습니다.

내 생각 엔 여기에는 '더 나은'선택이 없었기 때문에 표준 라이브러리로 들어 가지 않았습니다. 특히 2.0 부근에서 C #은 여전히 ​​Java의 실수로부터 배우고있었습니다. 표준 라이브러리의 컬렉션에 대한 Java의 '모든 것 및 부엌 싱크대'접근 방식도 피해야 할 것으로 보아도 놀라지 않을 것입니다.


1
메모리를 적게 사용하면서 조회 속도를 느리게하면 효과적으로 OrderedDictionarya가 List됩니다. 합법적 인 유스 케이스가있는 사람 OrderedDictionary은 O (1) 조회가 있지만 삽입 순서를 기억하기 때문에 추가 메모리를 사용하는 것이 불가피하고 수용 가능하기 때문에 특별히 사용하고 있다고 생각합니다.
Abion47
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.