在平常开发中,经常要遇到集合排序的功能,可以用集合自带的Sort 或者OrderBy方法进行排序,但是要自定义比较器,每次使用都比较麻烦,所以就自己琢磨写了个集合的扩展方法,专门用来排序集合,起名叫做 “OrderByField”。
方法有两个参数,orderName 和 order,前者是要排序的字段名称,后者为排序方式,升序或者降序。
扩展方法代码:
/// <summary>
/// IList根据字段排序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="orderName">排序属性名称</param>
/// <param name="order">排序方式(asc|desc)</param>
public static void OrderByField<T>(this IList<T> list, string orderName, string order = "asc")
{
List<T> newList = (List<T>)list;
var types = typeof(T).GetProperties();
var isExitsType = types.Where(k => k.Name == orderName);//是否存在属性
if (isExitsType != null || isExitsType.Count() > 0)
{
var listType = isExitsType.FirstOrDefault().PropertyType.Name;
newList.Sort(delegate(T a, T b)
{
var value1 = a.GetType().GetProperty(orderName).GetValue(a, null);
var value2 = b.GetType().GetProperty(orderName).GetValue(b, null);
IComparable comparableObj = value1 as IComparable;
comparableObj = comparableObj ?? value2 as IComparable;
return comparableObj != null ? comparableObj.CompareTo(value2) : 0;
});
if (order == "desc")
{
newList.Reverse();
}
}
}
代码中用到了反射来动态取出字段的值,再调用了IList的Sort方法进行了排序,
最后如果传过来的是降序(desc),则反转一下集合。
使用实例:
定义学生实体类:
class Student
{
public Student()
{
}
public Student(string no, string name, int age)
{
this.No = no;
this.Name = name;
this.Age = age;
}
public string No
{
get;
set;
}
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
}
定义集合:
List<Student> students = new List<Student>();
students.Add(new Student("001", "cuixingmin", 25));
students.Add(new Student("002", "sinman", 23));
students.Add(new Student("003", "trey", 22));
students.Add(new Student("004", "BruceLee", 24));
students.OrderByField("Name", "asc");
查看排序前后结果:
排序前:
排序后:
结果是预期的结果,是按Name升序Asc排序的。