2010-04-23 8 views
1

키의 가장 큰 값을 먼저 반환하는 IDictionary<float, foo>이 필요합니다.C# .NET : SortedDictionary의 내림차순 비교?

private IDictionary<float, foo> layers = new SortedDictionary<float, foo>(new DescendingComparer<float>()); 

class DescendingComparer<T> : IComparer<T> where T : IComparable<T> 
{ 
    public int Compare(T x, T y) 
    { 
     return -y.CompareTo(x); 
    } 
} 

그러나이 값은 가장 작은 값의 순서로 값을 반환합니다. 나는 여기서 바보 같은 실수를하고있는 것 같아.

그냥 무슨 일이 일어날 지 볼 수

, 나는 비교기에서 - 기호 제거 :

public int Compare(T x, T y) 
    { 
     return y.CompareTo(x); 
    } 

를하지만 같은 결과를 얻었다. 이것은 바보 같은 실수를하는 내 직감을 강화합니다.

은 사전에 액세스하는 코드입니다

foreach (KeyValuePair<float, foo> kv in sortedLayers) 
{ 
    // ... 
} 

UPDATE :이 작동하지만, 자주 나는이 메서드를 호출 할 필요가로 전화를 너무 느립니다 :

IOrderedEnumerable<KeyValuePair<float, foo>> sortedLayers = layers.OrderByDescending(kv => kv.Key); 
foreach (KeyValuePair<float, ICollection<IGameObjectController>> kv in sortedLayers) { 
    // ... 
} 

업데이트 : 나는 사전에서 kv 쌍을 추가하고 제거 할 때 결코 충돌하지 않는 비교기에 중단 점을 넣습니다. 이것은 무엇을 의미 할 수 있습니까?

+2

나는 y ou는 내림차순으로 오름차순으로 혼란 스럽습니다. 오름차순은 1 2 3 4 5 (가장 작은 값부터), 내림차순은 5 4 3 2 1 (가장 큰 값부터)입니다. – dtb

+0

@ dtb 당신이 틀립니다. –

+0

'y.CompareTo (x)'는 내림차순으로 작동해야합니다. 왜 그렇지 않을까요? : o 샘플을 조금주고 출력하면 알기가 더 쉬울 것입니다. [역순 정렬 사전 인터넷] (http://stackoverflow.com/questions/931891/reverse-sorted-dictionary-in-net) – nawfal

답변

3

는 (첫 번째 큰 값), 당신은 -x.CompareTo(y)

+0

@Rosarch : 확실히 작동해야합니다. 전에 사용했던 것 같습니다. 코드를 디버깅 할 경우 Compare 메서드가 실제로 호출되는 것을 알 수 있습니까? –

+0

실제로는 그렇지 않은 것 같습니다. 'SortedDictionary'를 잘못 작성하고 있습니까? –

+1

@Rosarch : 아니요, 사전을 올바르게 작성하고 있습니다. 요소를 추가/제거하고 열거 할 때 코드에서 나중에 작성한 동일한 사전을 사용하고 있는지 확인하십시오. IE. 'layers'에 대한 모든 참조를 찾아 다른'SortedDictionary'를 할당하는 다른 코드가 없는지 확인하십시오. –

0

는 시도 : 내림차순의 경우

public int Compare(T x, T y) 
{ 
    return x.CompareTo(y); 
} 
+0

아직도 그럴 수 없습니다. 흠 .. –

0
이 라인, 스위치 X에서

와 y를 할 것 :

return -y.CompareTo(x); 

그것을

확인
return -x.CompareTo(y);