ArrayList 自定义排序(转)

本文介绍了一种使用类型反射优化ArrayList排序的方法,通过实现IComparer接口并自定义排序逻辑,使得排序过程更加灵活高效。适用于不同类别的对象集合排序。
ArrayList可以用来组合任何的对象,但其默认的排序是按对象本身值来排序,而不是应用自定义的,因此需要重新修改 ArrayList的Sort方法的 IComparer接口实现。以下是重新写的 IComparer的实现,用了类型反射以做到能适合所有类的排序

性能测试:(仅供参考)
配置:PIII 733 384M内存
Windows2000SP4 .net FrameWork 1.1.4322 SP1

ArrayList容纳100个对象,排序时间大约10~20毫秒
ArrayList容纳1000个对象,排序时间大约100毫秒左右
ArrayList容纳10000个对象,排序时间大约1200~1600毫秒



代码:
ReverserClass
实现 IComparer接口的自定义类,其中定义了ArrayList包含的对象的类型 type和需要排序的类型的字段 name
public class ReverserClass:IComparer {
Typetype
=null;
stringname=string.Empty;
stringdirection="ASC";
publicReverserClass(Typetype,stringname,stringdirection){
this.type=type;
this.name=name;
if(direction.Equals("DESC"))
this.direction="DESC";
}


intIComparer.Compare(objectx,objecty){
objectx1=this.type.InvokeMember(this.name,BindingFlags.Public|BindingFlags.Instance|BindingFlags.GetProperty,null,x,null);
objecty1=this.type.InvokeMember(this.name,BindingFlags.Public|BindingFlags.Instance|BindingFlags.GetProperty,null,y,null);
if(direction.Equals("DESC"))
Swap(
refx1,refy1);
return((newCaseInsensitiveComparer()).Compare(x1,y1));
}


voidSwap(refobjectx,refobjecty){
objecttemp=null;
temp
=x;
x
=y;
y
=temp;
}


}


测试代码
UserClass
public class UserClass {
protectedstring_name;
protectedint_age;
protectedstring_address;

publicUserClass(string_name,int_age,string_address){
this._name=_name;
this._age=_age;
this._address=_address;
}


publicstringName{
get{return_name;}
set{_name=value;}
}


publicintAge{
get{return_age;}
set{_age=value;}
}


publicstringAddress{
get{return_address;}
set{_address=value;}
}


}

main
其中ReverserClassreverser= new ReverserClass(user.GetType(), " Name " ); 中的要传递ArrayList数组中的对象的类型和需要作为排序依据的字段名称!
static void Main( string []args)
{
UserClassuser;
ArrayListar
=newArrayList();
user
=newUserClass("1",1,"1");
ar.Add(user);
user
=newUserClass("9",9,"9");
ar.Add(user);
user
=newUserClass("4",4,"4");
ar.Add(user);
user
=newUserClass("3",3,"3");
ar.Add(user);
user
=newUserClass("6",6,"6");
ar.Add(user);

Console.WriteLine();
ReverserClassreverser
=newReverserClass(user.GetType(),"Name", "DESC");
ar.Sort(reverser);
Console.WriteLine();


}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值