1

IDictionary<float, foo>最初にキーの大きい値を返すaが必要です。

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)
{
    // ...
}

更新:これは機能しますが、このメソッドを呼び出す必要があるほど頻繁に呼び出すには遅すぎます:

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

更新:辞書にkvペアを追加したり削除したりするときに、ヒットしないブレークポイントをコンパレータに配置しました。これはどういう意味ですか?

4

3 に答える 3

3

降順(最大値が最初)の場合は、次のようにします。-x.CompareTo(y)

于 2010-04-23T22:36:41.300 に答える
0

この行で、xとyを切り替えます。

return -y.CompareTo(x);

成功する

return -x.CompareTo(y);
于 2010-04-23T23:59:08.467 に答える
0

試す:

public int Compare(T x, T y)
{
    return x.CompareTo(y);
}
于 2010-04-23T22:35:34.377 に答える