在工作中经常会遇到对象数组根据某个属性进行排序的问题这里介绍一个方法 以汽车为例 public class Car: { private int weight; public int Weight { get { return weight; } set { weight = value; } } private string type; public string Type { get { return type; } set { type = value; } } } Car[] cars现在需要排序首先我们想根据Weight进行排序大家自然会想到冒泡算法不过这个肯定不是最好的这里提供一个简便的方法 我们将类Car实现接口IComparable使其能够使用ArraySort() 代码如下 public class Car:IComparable<Car> { private int weight; public int Weight { get { return weight; } set { weight = value; } } private string type; public string Type { get { return type; } set { type = value; } } IComparable 成员#region IComparable<Employee> 成员 public int CompareTo(Car other) { if (thisweight == otherweight) return ; if (thisweight > otherweight) return ; return ; } #endregion }实现该方法以后我们就可以直接使用如下代码来对cars进行排序了 Car[] arr = new Car[] {carcarcar }; ArraySort<Car>(arr);但是随着项目的发展的发展我们会迎来新的问题我们现在又需要根据Type排序了怎么办呢? 不用担心我们只要使用一个最简单的Adapter模式就能解决这个问题 下面我们来创建这个适配器 public class ComparaCarAdapter : IComparer<Car> { IComparer 成员#region IComparer<Car> 成员 public int Compare(Car x Car y) { return xTypeCompareTo(yType); } #endregion }然后如此调用 ArraySort<Car>(arrnew ComparaCarAdapter());但是这样如果属性很多会产生很多的类怎么办呢那么利用反射吧将ComparaCarAdapter改造为 public class ComparaCarAdapter : IComparer<Car> { string _progName = ; public ComparaCarAdapter(string progName) { _progName = progName; } IComparer 成员#region IComparer<Employee> 成员 public int Compare(Car x Car y) { Type t = typeof(Car); PropertyInfo pi = tGetProperty(_progName); object xvalue = piGetValue(x null); object yvalue = piGetValue(y null); if (xvalue is string) { return ((string)xvalue)CompareTo((string)yvalue); } else { if (xvalue is int) return ((int)xvalue)CompareTo((int)yvalue); } throw new NotSupportedException(); } #endregion } 调用 ArraySort<Car>(arr new ComparaCarAdapter(Weight));OK搞定应该足够灵活了吧 |