Microsoft가 OrderedDictionary의 일반적인 구현을 제공하지 않은 이유는 무엇입니까?
내가 본 몇 가지 사용자 정의 구현이 있습니다. http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
그러나 왜 Microsoft가 기본 .net 라이브러리에 포함시키지 않았습니까? 분명히 그들은 제네릭을 만들지 않은 이유가 있었지만 … 무엇입니까?
이 메시지를 게시하기 전에 https://stackoverflow.com/questions/2629027/no-generic-implementation-of-orderdictionary를 보았습니다.
그러나 그것은 존재하지 않는다는 것을 확인합니다. 아니 왜 이 존재하지 않습니다.
감사
답변
에서 C # 4.0에서 간단히 말해서 나는이 읽기 :
- 이
OrderedDictionary
의 조합HashTable
및ArrayList
- 일반이 없습니다
ArrayList
- “비 제네릭
ArrayList
클래스는 주로 Framework 1.x와의 호환성을 위해 사용됩니다 …” - ”
ArrayList
기능적으로 유사하다List<object>
“ - “비 제네릭
ArrayList
을 사용하면List<object>
“
결론?
어떤 일반 OrderedDictionary
이 기본 있기 때문에 구조에는 일반 버전 자체가없는 (비공식적으로) 감가 상각 클래스입니다.
답변
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 뭔가를 할 수 있지만, 불행한 결정은 같은 구조의 필드를 포장하는 Point
과 Rectangle
에 대한 것을 수단을 myDict.ByKey[0] = "Wally"
하려면 myDict.ByKey
새로운 클래스의 객체를 반환해야합니다. 구조체는 더 효율적이지만 컴파일러는 읽기 전용 구조에 대한 쓰기처럼 보이는 것을 거부합니다 (속성이 속성이 반환 한 구조체를 수정하지는 않더라도)ByKey
참조가있는 컬렉션을 수정하십시오.
개인적으로, 나는 삽입 순서를 추적하도록 지정된 사전 같은 객체가 좋은 것이라고 생각합니다. 또한 특정 키와 관련된 키를 쉽게 반환 할 수있는 사전 -ish 객체를 갖고 싶습니다 (예 : 대소 문자를 구분하지 않는 사전이 있고 키가 “GEORGE”인 레코드를 추가 한 경우 KeyValuePair
열거에 반환 된 모든 객체 를 검색하지 않고도 사전에 “George”와 관련된 키를 요청할 수 있습니다.
답변
순서를 유지하면 추가 / 제거 성능이 떨어지고 메모리 사용량이 증가하는 두 컬렉션 (주문 용, 검색 용)을 래핑하지 않는 한 IDictionary가 암시하는 O (1) 조회를 방지 할 수 있습니다. 또는 메모리 사용량을 줄이기 위해 검색 속도가 느려질 수 있습니다.
내 생각 엔 여기에는 ‘더 나은’선택이 없었기 때문에 표준 라이브러리로 들어 가지 않았습니다. 특히 2.0 부근에서 C #은 여전히 Java의 실수로부터 배우고있었습니다. 표준 라이브러리의 컬렉션에 대한 Java의 ‘모든 것 및 부엌 싱크대’접근 방식도 피해야 할 것으로 보아도 놀라지 않을 것입니다.