C# .NET: المقارنة الهبوطية لمرض الفرز؟
-
01-10-2019 - |
سؤال
انا اريد 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);
لا تنتمي إلى StackOverflow