الفرز بطلاقة لقائمة على معايير متعددة باستخدام طرق التمديد؟
-
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 بشكل أساسي) ، أو ستحتاج إلى إنشاء المقارنة بشكل منفصل أولاً.
لا تنتمي إلى StackOverflow