2012-01-14 1 views
9

사전이 아닌 순차적 인 순서로 VALUE가 아닌 키순으로 정렬되는 방법이 있습니까? "SortedDictionary"개체를 읽었지만 슬프게도 키별로 정렬됩니다. 한 가지 해결책은 내 키를 내 값으로 뒤집어서 SortedDictionary에 배치하는 것입니다 (모든 정수이므로). 그러나 나는 그 중 하나와 함께가는 방법을 완전히 모릅니다.C# 값으로 정렬 된 사전을 반복하십시오.

+1

얼마나 자주 당신은 그것을 어떻게해야합니까? 얼마나 효율적입니까? 더 빠른 속도로 메모리를 교환 할 의향이 있습니까? – svick

+0

약 500 개의 결과에서만 작동하며 한 번만 작동합니다. 더 빠른 속도를 위해 항상 메모리를 교환 할 의향이 있습니다 : D –

답변

18

키/값 쌍을 가져 와서 정렬하고 반복합니다. 죽은 쉬운 사용하여 LINQ : 완료

foreach(var pair in dictionary.OrderBy(p => p.Value)) { 
    // work with pair.Key and pair.Value 
} 
+0

아, 고마워요! :) 그것은 내가 필요로하는 것처럼 정확하게 본다. LINQ에 대해 계속 들었습니다. 무엇입니까? –

+2

@ GeogesOatesLarsen : 사용하지 않아서 누락 된 부분입니다. [this] (http://msdn.microsoft.com/en-us/library/bb308959.aspx) 또는 Google에서 읽을 수 있습니다 (지금까지 더 나은 소개가 필요합니다). – Jon

0

, 사용자 정의 유형 (dictionary.OrderBy (P => p.Value)) "하지 않습니다"작업 위의 제안 된 코드입니다.

OrderBy는 IComparable을 사용하여 두 개체를 비교할 수 있습니다. 사전의 값이 사용자 지정 유형 인 경우 이 올바른 방법으로 값을 정렬 할 수 있도록 IComparable을 구현해야합니다.

읽을 내용은 here입니다. 값으로 // 정렬 사전

+0

"반드시 IComparable을 구현해야합니다"- 반드시 그런 것은 아닙니다. OrderBy()에는 두 가지 오버로드가 있습니다. 그 중 하나는 설명대로 작동하지만 두 번째는 사용자 지정 IComparable 개체를 허용하므로 모든 값 형식을 정렬 할 수 있습니다. – DXM

+0

@DXM, 다른 오버로드는 'IComparable'이 아니라'IComparer '를 허용합니다. 또한, 이것이 값 유형과 관련이 없다고 생각합니다. 모든 유형에 대해 동일하게 작동합니다. – svick

+0

@svick - 오타가 잘못되었습니다. 맞습니다. IComparer이지만 OP가 요구하는 부분에 대해 두 번째 오버로드가 발생했습니다. 자신 만의 comparer 객체를 작성하여 원하는 것을 비교하고 OrderBy()에 피드 할 수 있습니다. 그리고 "가치"에 의해 나는 가치 대 참고를 의미하지는 않았습니다. 나는 가치 대 열쇠를 의미했습니다. 비교자를 참조 유형뿐만 아니라 값 유형과 함께 사용할 수 있습니다. 이 답변에 동의하면 OrderBy는 IComparable을 구현하는 유형에서만 사용할 수 있습니다. 두 번째 오버로드가 무엇인지 설명 할 수 있습니까? – DXM

0

foreach (KeyValuePair<datatype, datatype> item in dictionary) 
{ 
//do something by value....accessing item.value 
}