C# IList集合扩展方法 -- 集合排序

时间:2021-04-29 17:48:55

       在平常开发中,经常要遇到集合排序的功能,可以用集合自带的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");

查看排序前后结果:

   排序前:

C# IList集合扩展方法 -- 集合排序C# IList集合扩展方法 -- 集合排序

排序后

C# IList集合扩展方法 -- 集合排序

C# IList集合扩展方法 -- 集合排序

结果是预期的结果,是按Name升序Asc排序的。