الفرز بطلاقة لقائمة على معايير متعددة باستخدام طرق التمديد؟

StackOverflow https://stackoverflow.com/questions/802002

  •  03-07-2019
  •  | 
  •  

سؤال

لفرز قائمة بمعايير متعددة ، أقوم حاليًا بعمل شيء مثل:

collection.Sort((f1, f2) =>
{
    var comp = f1.FirstCriteria.CompareTo(f2.FirstCriteria);
    return comp != 0 ? comp : f1.SecondCriteria.CompareTo(f2. SecondCriteria);
});

ولكن ألا يكون من الجيد أن تكون قادرًا على فعل شيء مثل:

collection.MultipleSort(f1.FirstCriteria, f2.FirstCriteria)
          .Then(f1.SecondCriteria, f2.SecondCriteria)

أي أفكار لتنفيذ جيد لواجهة بطلاقة للفرز؟

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

المحلول

تقصد شيئا مثل ما يلي؟

using System.Linq;

collection.OrderBy(t => t.FirstCriteria).ThenBy(t => t.SecondCriteria);

نصائح أخرى

المشكلة هنا هي أنه يبدو أنك تريد أن تفعل في المكان فرز؛ في هذه الحالة ، ستحتاج إلى معرفة (مع واجهة برمجة تطبيقات بطلاقة) عند الانتهاء من إضافة الظروف. هذا يتناقض مع نهج LINQ ، لأن ذلك يستخدم التنفيذ المؤجل.

لفرز حالة واحدة ، يمكنك استخدام شيء مثل:

public static void Sort<TSource, TValue>(this List<TSource> source,
        Func<TSource, TValue> selector) {
    var comparer = Comparer<TValue>.Default;
    source.Sort((x,y)=>comparer.Compare(selector(x),selector(y)));
}
public static void SortDescending<TSource, TValue>(this List<TSource> source,
        Func<TSource, TValue> selector) {
    var comparer = Comparer<TValue>.Default;
    source.Sort((x,y)=>comparer.Compare(selector(y),selector(x)));
}

سيكون من الصعب مع أنواع متعددة. لا يمكنك استخدام params لأن كل TValue قد تكون مختلفة. ربما تحتاج إلى إما استخدام خطوة Terminator وفئة "منشئ" وسيط (كتابة DSL بشكل أساسي) ، أو ستحتاج إلى إنشاء المقارنة بشكل منفصل أولاً.

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