سؤال

وحاليا لدي كائن تنفيذ واجهة IComparable (ASP.NET 3.5، VB). عندما أضع عدة كائنات مثيل في قائمة الوراثة، وفرزها عن طريق القيام someList.Sort بسيطة. مهمتي CompareTo() هي هذه:

Public Function CompareTo(ByVal obj As Object) As Integer Implements 
System.IComparable.CompareTo
    'default is number of votes (opposite direction, highest first)'
    Dim sent As Sentence = CType(obj, Sentence)
    Return Not Points.CompareTo(sent.Points)
End Function

وهذا يعمل بشكل جيد، إلا الان انا بحاجة لترتيب النتائج بحسب عقار آخر، الخاصية DateSubmitted، ومجموعة فرعية من النقاط. على سبيل المثال، إذا كانت ثلاث جمل الأصوات: 3، 1، 1، أريد واحد الحاصلين على اعلى الاصوات لأول مرة (من الواضح) ومن جملتين مع صوت واحد، واحد قدم أقرب وقت ممكن ليتم سرد

.

هل هذا ممكن مع CompareTo ()، أو ينبغي أن مجرد ضرب قاعدة البيانات مرة أخرى وترتيب هذا الامر هناك؟

والشكر

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

المحلول

ومنذ كنت على .NET Framework 3.5، يمكنك فرز باستخدام طريقة تمديد OrderBy بسهولة:

Dim someSortedList = someList.OrderBy(Function(item) item.SomeColumn) _
                             .ThenBy(Function(item) item.SomeOtherColumn)
                             .ToList()

' OrderByDescending and ThenByDescending are also there for descending order

وإذا كان يجب ان تضرب قاعدة البيانات مرة أخرى أم لا يتوقف على الطريقة التي قد استرجاع البيانات في المقام الأول. إذا كان لديك مجموعة كبيرة من البيانات وكنت قد استرجاع فقط مجموعة فرعية صغيرة منه من DB، ثم لا، يجب عليك فقط اسأل DB للاستيلاء على مجموعة فرعية صغيرة من البيانات استنادا إلى ترتيب جديد. خلاف ذلك، إذا كان لديك بالفعل كل شيء في الذاكرة، فقط ترتيب هذا الامر كما ذكرت أعلاه.

نصائح أخرى

ولديك وظيفة CompareTo () غير صحيحة. كنت بحاجة إلى العودة النتائج الصحيحة لثلاث ولايات (<، =، و>)، وNot الخاص يعني أن وظيفة فقط بشكل صحيح يعالج اثنين منهم. هذا <م> سوف يسبب مشاكل إذا كنت استدعاء الدالة على قائمة كبيرة بما فيه الكفاية.

وكما مهردادا التي سبق ذكرها، وصافي 3.5 لديه طريقة أسهل للتعامل مع ذلك. ولكن هنا كيف نفعل ذلك إذا لسبب ما لا يمكن التعامل مع التعبيرات لامدا:

Public Function CompareTo(Of Sentence)(ByVal obj As Sentence) As Integer _
  Implements System.IComparable.CompareTo(Of Sentence)

    If obj Is Nothing Return 1
    Dim result As Integer = Points.CompareTo(obj.Points) * -1
    If result = 0 Then result = DateSubmitted.CompareTo(obj.DateSubmitted)
    Return result
End Function

وتجدر الإشارة إلى أنك تريد الآن لتنفيذ IComparable(Of T)، بدلا من IComparable.

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