2010-04-23 56 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你在上升與下降混淆。上升爲1 2 3 4 5(最小​​值第一),下降爲5 4 3 2 1(最大值第一)。 – dtb 2010-04-23 22:41:49

+0

@dtb你是對的。 – 2010-04-23 22:42:36

+0

'y.CompareTo(x)'應該按降序工作。爲什麼不呢? :o如果你提供了很少的樣本和輸出,它會更容易知道。請參閱[反向排序字典在網絡](http://stackoverflow.com/questions/931891/reverse-sorted-dictionary-in-net) – nawfal 2014-06-15 10:28:56

回答

3

按降序排序(第一大值),你會做-x.CompareTo(y)

+0

@Rosarch:它絕對應該工作,我知道我以前用過它。如果你調試你的代碼,你會發現你的Compare方法實際上是被調用的嗎? – 2010-04-23 22:46:05

+0

看起來不是,實際上。我是否錯誤地創建了'SortedDictionary'? – 2010-04-23 22:48:10

+1

@Rosarch:不,你正在創建字典。在添加/刪除元素和枚舉時,請確保您使用的是您之前在代碼中構建的相同字典。 IE瀏覽器。查找所有對'layers'的引用,並確保沒有另一段代碼分配不同的'SortedDictionary'。 – 2010-04-23 22:59:30

0

嘗試:

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

這仍然沒有做到這一點。嗯.. – 2010-04-23 22:39:18

0

在這條線,開關X和Y:

return -y.CompareTo(x); 

讓它

return -x.CompareTo(y);