2008-10-21 8 views
5

열거 목적으로 사전에 추가 된 항목의 순서를 믿을 수 없다고 생각합니다."추가 주문"에서 열거하고 키를 통해 가져올 수있는 dotnet 컬렉션 클래스의 항목은 무엇입니까?

항목이 키로 추가 될 수 있고 추가 순서로 열거 될 수 있거나 키로 검색 될 수있는 클래스 (가능한 경우 일반)가 있습니까?

설명 : Key Order에서 열거하고 싶지 않습니다. 나는 추가 순서로 열거하고 싶다. 즉, FIFO (열 우선) 기준으로 열거를 통해 항목을 검색 할 수 있기를 원합니다.

답변

3

먼저, 기본 가정에서 정확합니다. 일반 사전은 열거 순서를 보장하지 않습니다.

두 번째로 SortedDictionary을 사용자 정의 IComparer 경로로 지정하는 데주의해야합니다. 비교자는 키 정렬과 컬렉션 정렬에 사용됩니다. 즉, 추가 순서에 따라 IComparer을 사용하면 키 값으로 SortedDictionary에서 요소를 검색하는 데 어려움을 겪을 수 있습니다. 정렬 된 사전의 백업 인 트리에서 손실 될 수 있습니다.

C5 일반 클래스 라이브러리 경로를 기꺼이 사용하려는 경우 T가 자체 입력되는 경우 HashedLinkedList<KeyValuePair<T>> 또는 HashedLinkedList<T>에서 좋은 마일리지를 얻을 수 있습니다. 키를 조작하여 해시 코드를 생성하는 IEqualityComparer을 만들 수 있습니다. 그런 다음 실제 값을 검색, 당신은 저장 T을 찾을 것입니다 (키가 설정되어 아마도 전용) 프로토 타입 X와 Find(ref T x)를 사용하고 반환 할 수 O (1) 시간 대 O (로그에 참조로 n)이고 SortedDictionary입니다. 뿐만 아니라 LinkedList의 지원을 받으면 추가 순서로 열거 할 수 있으며 C5의 IDirectedEnumerable을 통해 원하는 방향을 지정할 수 있습니다.

희망이 있습니다.

4

추가 순서대로 키를 저장하는 List을 사용하면 원하는 효과를 얻을 수 있습니다. 그런 다음 해당 목록을 순서대로 열거하고 Dictionary에서 값을 검색 할 수 있습니다.

그러나이 모든 작업을 하나의 기존 컬렉션 형식으로 수행하려는 경우 필자는 비교자를 제공 할 필요가 없거나 키가 항목의 일부가 아닌 경우이 작업을 수행하는 형식을 인식하지 못합니다. 이전 버전의 경우 SortedDictionary을 시도하고 후자의 경우 KeyedCollection에서 새 컬렉션을 파생시킬 수 있습니다 (비교기없이 순서를 유지할 것이 확실하지 않으므로이를 확인하기 위해 실험해야합니다).

0
당신은 당신의 자신의 제네릭 클래스를 생성 (그리고 사전 <,> 또는 SortedDictionary <>에서 파생가) 당신이 키에 의해 사전을 정렬 할 수있는 GetEnumerator를()의 자신의 버전을 구현하고 정렬 값을 반환 할 수

(또는 SortedDictionary를 사용하는 경우 이미 정렬되어 있습니다.)

또한 어떤 경우에는 더 좋고 더 가벼운 SortedList <을 사용할 수 있습니다. MSDN을 확인하여 필요에 가장 적합한 것을 확인하십시오.

+0

"키"순서가 아닙니다. 나는 추가 명령을 받고있다. GetEnumerator를 상속하고 재정의하는 것이 중요하지만 –

0

주제가 조금 오래되었지만 동일한 동작 (항목이 추가 된 순서 유지)을 갖고 있으며 키의 모음을 색인화 할 수있는 모음을 찾고있었습니다. 대답은 추상적 인 클래스 KeyedCollection <!>입니다! (in System.Collections.ObjectModel 네임 스페이스) 여러 번 추가하여 가운데에서 하나를 제거하고 항목을 다시 추가하여 사전 및이 키 집합의 간단한 테스트를 실행했습니다. KeyedCollection은 끝에 새 항목을 추가하고 Dictionary는 원래 위치에 배치합니다. (어떤 종류의 해싱이 거기에 있다고 생각합니다)