سؤال

لدي قائمة بالعناصر في قائمة عامة:

  • A1 (فهرس الفرز 1)
  • A2 (فرز فهرس 2)
  • B1 (فهرس الفرز 3)
  • B2 (فهرس الفرز 3)
  • B3 (فهرس الفرز 3)

المقارنة عليهم يأخذ النموذج:

this.sortIndex.CompareTo(other.sortIndex)

عندما أقوم بقائمة. sort () في قائمة العناصر ، أحصل على الطلب التالي:

  • A1
  • A2
  • B3
  • B2
  • B1

من الواضح أنه كان يعمل بمعنى أن فهارس الفرز بالترتيب الصحيح ، لكنني لا أريد حقًا إعادة ترتيب العناصر "B".

هل هناك أي قرص يمكنني القيام به لمقاربي لإصلاح هذا؟

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

المحلول

OrderBy يحافظ على طلب العناصر المتساوية:

myList = myList.OrderBy(item => item.SortIndex).ToList();

نصائح أخرى

تحتاج إلى استخدام "نوع مستقر"الخوارزمية إذا كنت لا تريد عناصر تساوي موقف التغيير.

الدفع "دمج الفرز"للحصول على مثال على خوارزمية فرز مستقر. ها هي التنفيذ منه في C#.

StableSort() طريقة التمديد ل List<T> هو هنا

يمكنك تغيير المقارن الخاص بك للقيام برسم ثانوي على القيمة:

if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex
{
   return this.Value.CompareTo(other.Value);
}
return 0;

يستخدم Sort Quicksort ، ولا يضمن التسلسل الأصلي في حالة المقارنة المساواة.

إذا كنت لا تزال ترغب في استخدام list.sort ، يمكنك إضافة مقارنة ثانية مع الفهرس الأصلي مثل:

int c = this.sortIndex.CompareTo(other.sortIndex);
if (c == 0)
  c = this.originalIndex.CompareTo(other.originalIndex);
return c;

وإلا يمكنك الفرز مع خوارزميات "مستقرة" أخرى (على سبيل المثال linq orderby).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top