2013-11-09 1 views
2

시퀀스로 정렬 된 테이블의 이름을 가진 List (myList)가 있습니다. 나는 테이블과 값으로 EntityObject를 가지고있는 구조체 키와 사전을 가지고목록 컬렉션에서 요소와 관련된 사전을 정렬하는 방법 C#

다음
List<MyObject>[0] = MyObject.Sequence = 0, MyObject.Table = "Cat" 
List<MyObject>[1] = MyObject.Sequence = 1, MyObject.Table = "Dog" 
List<MyObject>[2] = MyObject.Sequence = 2, MyObject.Table = "Bird" 
List<MyObject>[3] = MyObject.Sequence = 3, MyObject.Table = "Fish" 

, 그래서이 : MyObject를 2 개 속성을 표 (문자열) 및 시퀀스 (INT)

List<MyObject> 

예를 가지고 사전은 이미 그래서 테이블 순서를 포함하도록 사전을 다시 목록에 따라 내 사전을 주문하려면이

dict[0] = key (ID = 1, Table = "Cat"), EntityObject = Cat 
dict[1] = key (ID = 2, Table = "Dog"), EntityObject = Dog 
dict[2] = key (ID = 3, Table = "Bird"), EntityObject = Bird 
dict[3] = key (ID = 4, Table = "Fish"), EntityObject = Fish 
dict[4] = key (ID = 5, Table = "Cat"), EntityObject = Cat 
dict[5] = key (ID = 6, Table = "Dog"), EntityObject = Dog 
dict[6] = key (ID = 7, Table = "Cat"), EntityObject = Cat 
dict[7] = key (ID = 8, Table = "Dog"), EntityObject = Dog 
dict[8] = key (ID = 9, Table = "Cat"), EntityObject = Cat 
dict[9] = key (ID = 10, Table = "Fish"), EntityObject = Fish 

같은 10 개 개체 값 가득 그것은이

dict[0] = key (ID = 1, Table = "Cat"), EntityObject = Cat 
dict[1] = key (ID = 5, Table = "Cat"), EntityObject = Cat 
dict[2] = key (ID = 7, Table = "Cat"), EntityObject = Cat 
dict[3] = key (ID = 9, Table = "Cat"), EntityObject = Cat 
dict[4] = key (ID = 2, Table = "Dog"), EntityObject = Dog 
dict[5] = key (ID = 6, Table = "Dog"), EntityObject = Dog 
dict[6] = key (ID = 8, Table = "Dog"), EntityObject = Dog 
dict[7] = key (ID = 3, Table = "Bird"), EntityObject = Bird 
dict[8] = key (ID = 4, Table = "Fish"), EntityObject = Fish 
dict[9] = key (ID = 10, Table = "Fish"), EntityObject = Fish 

처럼 나는 에 새 사전을 foreach 문으로 루프를 방지 한 후 다시 원하는 다음 기존에 복사 또는 복제. 그래서 나는 잠시 동안이 비행을 시도했지만, 나는 항상 같은 정렬되지 않은 목록을 가졌습니다. 어쩌면 내가 Sort 또는 OrderBy 메서드가 누락되었지만 누군가이 문제를 해결하는 데 도움을 줄 수 있습니다. 제안?

Dictionary<MyStruct, EntityObject> dict = this.GetDictionary() 
    .ToList() 
    .FindAll(x => x.Key.Table == myList.Find(y => y.Table == x.Key.Table).Table) 
    .ToDictionary(a => a.Key, b => b.Value); 

참고 :

얘들 아 내가 이미 사전 정렬 할 수 없음을 알고 있지만 당신이 내 방식을 보면, 내가 메모리의 요소를 주문하고 지정하려고 새 사전을 다시 해요 그것은 "dict"합니다. 나는 최근에 수정 아무것도하지만, 여전히 만든

--- 수정 ---. 도와주세요.

Dictionary<MyStruct, EntityObject> 
     dict = this.GetDictionary() 
       .ToList() 
       .OrderBy(x => x.Key.Table == myList 
       .Find(z => z.Table == x.Key.Table).Table) 
       .ToDictionary(x => x.Key, y => y.Value); 
+1

'이미 사전을 분류 할 수 없다는 것을 알고 있습니다. '...'나는 요소를 순서화하려고하는 새 사전을 만들고 있습니다. '이제 문제가 무엇인지 확인해야합니다. 사전에는 주.이 없으므로 사전에 삽입 한 순서는 메모리에 h 치된 f 식에 영향을주지 않습니다. 설명하는 것처럼 동작하도록하려면 'OrderedDictionary' 또는 KeyedCollection [Dennis가 설명하는]과 같은 다른 것으로 전환해야합니다 (http://stackoverflow.com/a/19880082/80274). –

답변

2

사전은 키를 이용한 빠른 값 검색을위한 것입니다. 따라서 사전은 검색을 위해 내부 저장소를 최적화하므로 기본적으로 사전은 정렬되지 않은 데이터 구조입니다. 해시 기반 검색 (예 : HashSet)을 사용하는 다른 컨테이너에서도 마찬가지입니다.

사전에 항목을 추가하면 제공된 키의 해시 코드가 계산되고 계산 된 해시 코드에 해당하는 값이 버킷에 저장됩니다. (예를 들어, List<T>과 비교하여) 콜렉션의 끝에 값을 추가하지 않습니다. 따라서 "주문"또는 항목은 키의 해시 코드로만 결정됩니다.

일부 항목 순서를 유지하려면 (정확하게 말하면 색인으로 항목에 액세스하는 기능을 원할 경우) 사전을 사용하려면 OrderedDictionary 또는 KeyedCollection과 같은 특별한 구현이 필요합니다.

0

Dictionary<K, V>을 정렬 할 수 없습니다. 해시 테이블을 기반으로합니다. 정렬 순서는 해시 키와 사용 된 알고리즘에 따라 다릅니다. 이렇게하면 예측할 수없는 순서가 생깁니다.

SortedDictionary<K, V>이 있지만 그 중 하나가 키순으로 정렬되어 있습니다. 당신이 원하는 것이 아닙니다.

정렬에 시퀀스 번호를 사용하려면 테이블 이름별로 사전에 저장해야합니다.

var tableSequence = new Dictionary<string, int>(); 
tableSequence.Add("Cat", 0); 
tableSequence.Add("Dog", 1); 
... 

은 그럼 당신은 엔티티 개체를 정렬이 정보를 사용할 수 있습니다

Dictionary<MyStruct, EntityObject> dict = this.GetDictionary(); 
var orderedList = dict 
    .OrderBy(x => tableSequence[x.Key.Table]) 
    .ToList(); 

정렬 순서를 distroy 것이다 사전에이 정보를 다시 저장.


System.Collections.Specialized.OrderedDictionary도 있지만 일반적이지는 않습니다. 참고 : 정렬되지 않고 정렬됩니다. 즉, 요소는 입력 한 순서대로 저장됩니다. 기본적으로 미리 정렬 된 요소를 하나씩 루프에 추가해야합니다. 그런 다음 색인 또는 키를 사용하여 요소에 액세스 할 수 있습니다.

관련 문제