网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > ASP.NET > 对象数组根据某属性列的灵活排序  

对象数组根据某属性列的灵活排序

2008-01-05  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

    在工作中经常会遇到对象数组根据某个属性进行排序的问题。这里介绍一个方法。
  以汽车为例: public class Car: {
   private int weight;

网管u家u.bitsCN.com

   public int Weight
   {
   get { return weight; }
   set { weight = value; }
   }
   private string type;

中国网管联盟bitsCN.com

   public string Type
   {
   get { return type; }
   set { type = value; }
   }
   }
  Car[] cars;现在需要排序,首先我们想根据Weight进行排序,大家自然会想到冒泡算法。不过这个肯定不是最好的,这里提供一个简便的方法。 网管网www.bitscn.com

  我们将类Car实现接口IComparable使其能够使用Array.Sort()。
  代码如下:

网管联盟bitsCN@com


   public class Car:IComparable<Car>
   {
   private int weight;

网管u家u.bitsCN.com

   public int Weight
   {
   get { return weight; }
   set { weight = value; }
   }
   private string type;

网管下载dl.bitscn.com

   public string Type
   {
   get { return type; }
   set { type = value; }
   } 中国网管论坛bbs.bitsCN.com

   IComparable 成员#region IComparable<Employee> 成员

网管u家u.bitscn@com

   public int CompareTo(Car other)
   {
   if (this.weight == other.weight)
   return 0;
   if (this.weight > other.weight)
   return 1;
   return -1;
   } 网管u家u.bitscn@com

   #endregion
   }实现该方法以后我们就可以直接使用如下代码来对cars进行排序了。
   Car[] arr = new Car[] {car1,car2,car3 };
   Array.Sort<Car>(arr);但是随着项目的发展的发展我们会迎来新的问题,我们现在又需要根据Type排序了,怎么办呢?
  不用担心我们只要使用一个最简单的Adapter模式就能解决这个问题
  下面我们来创建这个适配器:
   public class ComparaCarAdapter : IComparer<Car>
   {

网管下载dl.bitscn.com

   IComparer 成员#region IComparer<Car> 成员 网管bitscn_com

   public int Compare(Car x, Car y)
   {
   return x.Type.CompareTo(y.Type);
   } 中国网管联盟bitsCN.com

   #endregion
   }然后如此调用:
  Array.Sort<Car>(arr,new ComparaCarAdapter());但是这样如果属性很多,会产生很多的类,怎么办呢。那么利用反射吧。将ComparaCarAdapter改造为:
   public class ComparaCarAdapter : IComparer<Car>
   {
   string _progName = "";
   public ComparaCarAdapter(string progName)
   {
   _progName = progName;
   }
   IComparer 成员#region IComparer<Employee> 成员

中国网管联盟bitsCN.com

   public int Compare(Car x, Car y)
   {
   Type t = typeof(Car);
   PropertyInfo pi = t.GetProperty(_progName);
   object xvalue = pi.GetValue(x, null);
   object yvalue = pi.GetValue(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();
   }

中国网管论坛bbs.bitsCN.com

   #endregion
   }
  调用 Array.Sort<Car>(arr, new ComparaCarAdapter("Weight"));OK搞定,应该足够灵活了吧。 网管下载dl.bitscn.com


TAGs   排序   灵活   属性   根据   对象       public   int   Car   return      
 上一篇:ASP.NET 3.5 Extensions带来什么   下一篇:关于ASP.NET 2.0的目录结构变化
对象数组根据某属性列的灵活排序 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: