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

本文介绍了一种对象数组根据不同属性灵活排序的方法。通过实现IComparable接口进行基本排序,并利用Adapter模式及反射技术实现多属性排序,提高了代码复用性和扩展性。
在工作中经常会遇到对象数组根据某个属性进行排序的问题。这里介绍一个方法。
以汽车为例:
     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使其能够使用Array.Sort()。
代码如下:

     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 (this.weight == other.weight)
                
return 0;
            
if (this.weight > other.weight)
                
return 1;
            
return -1;
        }


        
#endregion

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

        
IComparer 成员#region IComparer<Car> 成员

        
public int Compare(Car x, Car y)
        
{
            
return x.Type.CompareTo(y.Type);
        }


        
#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> 成员

        
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();
        }


        
#endregion

    }

调用
Array.Sort < Car > (arr,  new  ComparaCarAdapter( " Weight " ));
OK搞定,应该足够灵活了吧。

(转载请通知并注明出处。)
posted on 2008-01-03 13:45 tianyamoon 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tianyamoon/archive/2008/01/03/1024481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值