سؤال

انا اريد IDictionary<float, foo> هذا يعيد قيم larges للمفتاح أولاً.

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 من القاموس. ماذا يمكن أن يعني هذا؟

هل كانت مفيدة؟

المحلول

للحصول على ترتيب تنازلي (أكبر قيم أولا) ، ستفعل -x.CompareTo(y)

نصائح أخرى

محاولة:

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

في هذا الخط ، التبديل x و y:

return -y.CompareTo(x);

أصنعها

return -x.CompareTo(y);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top