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


}
性能测试:(仅供参考)
配置: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
测试代码
UserClass
main
其中ReverserClassreverser= new ReverserClass(user.GetType(), " Name " ); 中的要传递ArrayList数组中的对象的类型和需要作为排序依据的字段名称!
本文介绍了一种使用类型反射优化ArrayList排序的方法,通过实现IComparer接口并自定义排序逻辑,使得排序过程更加灵活高效。适用于不同类别的对象集合排序。
2792

被折叠的 条评论
为什么被折叠?



