实现通用扩展
本文关键字:扩展 实现 | 更新日期: 2023-09-27 18:25:33
我有一个扩展IList<>的方法对于我需要执行的特殊订单。它接受一个IDisplayOrderable
的IList和一个整数forRandom
,并返回一个有序列表,但将DisplayOrder
等于forRandom
参数的项随机化。
public static IList<IDisplayOrderable> ReorderList(this IList<IDisplayOrderable> lstMain, int forRandom)
{
List<IDisplayOrderable> result = new List<IDisplayOrderable>();
Random rnd = new Random();
result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) < forRandom).OrderBy(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue)));
result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) == forRandom).Shuffle(rnd));
result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) > forRandom).OrderBy(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue)));
return result;
}
IDisplayOrderable
是一个简单的接口,用于公开DisplayOrder
以对不同类型进行排序。
public interface IDisplayOrderable
{
Nullable<int> DisplayOrder { get; set; }
}
我想实现相同的功能,但对于我希望显式设置"OrderBy"属性的泛型列表,类似于:MyList.ReorderList(x=>x.DisplayOrder, 1000)
,但也包括MyOtherList.ReorderList(x=>x.OtherDisplayOrder, 1000)
。为了做到这一点,我读了一些关于反思的文章,但还没有找到有效的方法。如有任何帮助或指导,将不胜感激
更改ReorderList
方法,使其接受返回所需属性值的委托:
public static IList<T> ReorderList(this IList<T> lstMain,Func<T,int?> getter, int forRandom)
{
List<T> result = new List<T>();
Random rnd = new Random();
result.AddRange(lstMain.Where(x => getter(x).GetValueOrDefault(int.MaxValue) < forRandom).OrderBy(x => getter(x).GetValueOrDefault(int.MaxValue)));
result.AddRange(lstMain.Where(x => x.getter(x).GetValueOrDefault(int.MaxValue) == forRandom).Shuffle(rnd));
result.AddRange(lstMain.Where(x => getter(x).GetValueOrDefault(int.MaxValue) > forRandom).OrderBy(x => xgetter(x).GetValueOrDefault(int.MaxValue)));
return result;
}
并称之为:
MyOtherList.ReorderList(x=>x.OtherDisplayOrder, 1000)