由于项目的原因用到了List<T> 泛型,Framework都已经到了3.5了。可是我一直都没有正式的用过2.0很是遗憾。
特别是对泛型更是一知半解,今天又弄了些资料觉得挺有用就收集到博客上来了。
闲话少叙,今天用到的List<T>的Sort功能纯属是从高人那里得来的,只是进行了少量的改动而已。
要对自定义类数组或List进行排序,譬如:
List<User> userList;
ArrayList arrayList;
最重要的是:继承IComparer<T>接口,实现int IComparer<T>.Compare(T t1, T t2)方法。
代码如下:
/// <summary> /// 继承IComparer <T> 接口,实现同一自定义类型 对象比较 /// </summary> /// <typeparam name="T"> T为泛用类型 </typeparam>
public
class
Reverser
<
T
>
: IComparer
<
T
>
{ private Type type = null ; private ReverserInfo info; /// <summary> /// 构造函数 /// </summary> /// <param name="type"> 进行比较的类类型 </param> /// <param name="name"> 进行比较对象的属性名称 </param> /// <param name="direction"> 比较方向(升序/降序) </param> public Reverser(Type type, string name, ReverserInfo.Direction direction) { this .type = type; this .info.name = name; if (direction != ReverserInfo.Direction.ASC) this .info.direction = direction; } /// <summary> /// 构造函数 /// </summary> /// <param name="className"> 进行比较的类名称 </param> /// <param name="name"> 进行比较对象的属性名称 </param> /// <param name="direction"> 比较方向(升序/降序) </param> public Reverser( string className, string name, ReverserInfo.Direction direction) { try { this .type = Type.GetType(className, true ); this .info.name = name; this .info.direction = direction; } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 构造函数 /// </summary> /// <param name="t"> 进行比较的类型的实例 </param> /// <param name="name"> 进行比较对象的属性名称 </param> /// <param name="direction"> 比较方向(升序/降序) </param> public Reverser(T t, string name, ReverserInfo.Direction direction) { this .type = t.GetType(); this .info.name = name; this .info.direction = direction; } // 必须!实现IComparer<T>的比较方法。 int IComparer < T > .Compare(T t1, T t2) { object x = this .type.InvokeMember( this .info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null , t1, null ); object y = this .type.InvokeMember( this .info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null , t2, null ); if ( this .info.direction != ReverserInfo.Direction.ASC) Swap( ref x, ref y); return ( new CaseInsensitiveComparer()).Compare(x, y); } // 交换操作数 private void Swap( ref object x, ref object y) { object temp = null ; temp = x; x = y; y = temp; } }
/// <summary> /// 对象比较时使用的信息类 /// </summary>
public
struct
ReverserInfo
{ /// <summary> /// 比较的方向,如下: /// ASC:升序 /// DESC:降序 /// </summary> public enum Direction { ASC = 0 , DESC, } ; public enum Target { CUSTOMER = 0 , FORM, FIELD, SERVER, } ; public string name; public Direction direction; public Target target; }
上面主要是运用了 C#的反射 和 Framework中的排序算法。
像上面那样实现接口后,就可以使用List<T>进行 升序/降序 排序了。
测试代码如下:
using
System;
using
System.Collections.Generic;
using
System.Collections;
using
System.Reflection;
using
System.Text;
namespace
List_T_SortTest_u_2
{ 测试Reverser
代码段 }
以上全部完成!另外,各位观众,小弟刚开始接触Framework2.0,也是生硬的套用高人的代码,难免会有错误。
还请各位指正。谢谢先。