C# List<T>进行多字段排序
发布时间:2020-12-15 17:55:34 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 //调用方法 IListclass List = new Listclass(); //排序字段string[] property = new string[] { "column1","column2" };//对应排序字段的排序方式boo
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 //调用方法 IList<class> List = new List<class>(); //排序字段 string[] property = new string[] { "column1","column2" }; //对应排序字段的排序方式 bool[] sort =new bool[]{ false,false }; //对 List 排序 List = new IListSort<class>(List,property,sort).Sort(); using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace Common { /// <summary> /// IList排序类 /// </summary> /// <typeparam name="T"></typeparam> public class IListSort<T> { private string[] _propertyName; private bool[] _sortBy; private IList<T> _list; /// <summary> /// 构造函数 /// </summary> /// <param name="list">排序的Ilist</param> /// <param name="propertyName">排序字段属性名</param> /// <param name="sortBy">true升序 false 降序 不指定则为true</param> public IListSort(IList<T> list,string[] propertyName,bool[] sortBy) { _list = list; _propertyName = propertyName; _sortBy = sortBy; } /// <summary> /// 构造函数 /// </summary> /// <param name="list">排序的Ilist</param> /// <param name="propertyName">排序字段属性名</param> /// <param name="sortBy">true升序 false 降序 不指定则为true</param> public IListSort(IList<T> list,string[] propertyName) { _list = list; _propertyName = propertyName; for (int i = 0; i < _propertyName.Length; i++) { _sortBy[i] = true; } } /// <summary> /// IList /// </summary> public IList<T> List { get { return _list; } set { _list = value; } } /// <summary> /// 排序字段属性名 /// </summary> public string[] PropertyName { get { return _propertyName; } set { _propertyName = value; } } /// <summary> /// true升序 false 降序 /// </summary> public bool[] SortBy { get { return _sortBy; } set { _sortBy = value; } } /// <summary> /// 排序,插入排序方法 /// </summary> /// <returns></returns> public IList<T> Sort() { if (_list.Count == 0) return _list; for (int i = 1; i < _list.Count; i++) { T t = _list[i]; int j = i; while ((j > 0) && Compare(_list[j - 1],t) < 0) { _list[j] = _list[j - 1]; --j; } _list[j] = t; } return _list; } /// <summary> /// 比较大小 返回值 小于零则X小于Y,等于零则X等于Y,大于零则X大于Y /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> private int Compare(T x,T y) { int i =0; //检查属性名 for (i = 0; i < _propertyName.Length; ++i) { if (string.IsNullOrEmpty(_propertyName[i])) throw new ArgumentNullException("没有指字对象的排序字段属性名!"); } //取属性的属性 PropertyInfo[] property = new PropertyInfo[_propertyName.Length]; for (i = 0; i < _propertyName.Length; ++i) { property[i] = typeof(T).GetProperty(_propertyName[i]); if (property[i] == null) throw new ArgumentNullException("在对象中没有找到指定属性!"); } int compare = 0; for (i = 0; i < _propertyName.Length;++i) { compare = CompareOne(x,y,property[i],_sortBy[i]); if (compare != 0) return compare; } return compare; } private int CompareOne(T x,T y,PropertyInfo property,bool sortBy) { switch (property.PropertyType.ToString()) { case "System.Int32": int int1 = 0; int int2 = 0; if (property.GetValue(x,null) != null) { int1 = Convert.ToInt32(property.GetValue(x,null)); } if (property.GetValue(y,null) != null) { int2 = Convert.ToInt32(property.GetValue(y,null)); } if (sortBy) { return int2.CompareTo(int1); } else { return int1.CompareTo(int2); } break; case "System.Double": double double1 = 0; double double2 = 0; if (property.GetValue(x,null) != null) { double1 = Convert.ToDouble(property.GetValue(x,null) != null) { double2 = Convert.ToDouble(property.GetValue(y,null)); } if (sortBy) { return double2.CompareTo(double1); } else { return double1.CompareTo(double2); } break; case "System.String": string string1 = string.Empty; string string2 = string.Empty; if (property.GetValue(x,null) != null) { string1 = property.GetValue(x,null).ToString(); } if (property.GetValue(y,null) != null) { string2 = property.GetValue(y,null).ToString(); } if (sortBy) { return string2.CompareTo(string1); } else { return string1.CompareTo(string2); } break; case "System.DateTime": DateTime DateTime1 = DateTime.Now; DateTime DateTime2 = DateTime.Now; if (property.GetValue(x,null) != null) { DateTime1 = Convert.ToDateTime(property.GetValue(x,null) != null) { DateTime2 = Convert.ToDateTime(property.GetValue(y,null)); } if (sortBy) { return DateTime2.CompareTo(DateTime1); } else { return DateTime1.CompareTo(DateTime2); } break; } return 0; } } } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |