如果要在下面中要你对集合数据进行排序,在dotnet1.1中我们可以使用list.sort,有两种方法,
public void List.Sort(IComparer);
他们的区别在前面我那篇英文的文章中写的很清楚了。在什么情况下用那种,我这里就用文章中说到的第二种。
{
private int age;
private string name;
public Student( int age, string name)
{
this .age = age;
this .name = name;
}
public int Age
{
get
{
return age;
}
set
{
this .age = value;
}
}
public string Name
{
get
{
return name;
}
set
{
this .name = value;
}
}
}
public class StudentComparer : IComparer
{
public int Compare( object x, object y)
{
Student left = x as Student();
Student right = y as Student();
return left.age.CompareTo(right.age);
}
}
然后使用:
arr.add( new Student( 18 , " zhang1 " ));
arr.add( new Student( 17 , " zhang1 " ));
arr.add( new Student( 18 , " zhang1 " ));
arr.sort( new StudentComparer());
搞定。但我想更灵活点,写个方法让你可以有选择的进行升序和降序
{
List.sort( new StudentComparer(ascending));
}
这样就灵活了。但是上面的类还要改。
{
private bool ascending;
public StudentComparer( bool ascending)
{
this .ascending = ascending;
}
public int Compare( object x, object y)
{
Student left = x as Student();
Student right = y as Student();
return left.age.CompareTo( right.age ) * ( ascending ? 1 : - 1 );
}
}
好了dotnet1.1版本的实现了,路漫漫其修远兮。有点不想写了,坚持。qq zone真不爽,不支持高亮,我明天去博客园申请个博客。我这代码是qq zone里直接写的,不能完全保证编译通过。
接下来就到dotnet2.0的功能部分了。激动人心,几乎颠覆传统思想。要抗住,技术几年换一代。所以说要把基础打好(美国当今成熟一代程序员,都是看懂LINUX源代码,算法和基本功很过硬的,所以他们不说别的,新技术到手上,可以很快消化。而作为半路上来做程序员的你,你就要思考了),废话不说了,开始
public void List < T > .Sort(Comparison < T > );
public void List < T > .Sort(IComparer < T > );
public void List < T > .Sort(Int32, Int32, IComparer < T > );
四个重载,同时都是泛型的。
第一个和第三个重载跟上面说道的dotnet 1.1的那两个一样,只是泛型版本而已。不说了。
现在我主要展示第二个。
我同样实现上面的学生类排序
private int age;
private string name;
public Student( int age, string name)
{
this .age = age;
this .name = name;
}
public int Age
{
get
{
return age;
}
set
{
this .age = value;
}
}
public string Name
{
get
{
return name;
}
set
{
this .name = value;
}
}
}
这个类不变。照抄。
接下来写排序方法,支持升序和降序
Comparison是个泛型委托,我定义个排序方法给它。
{
return (a.Age - b.Age);
}
public void SortByStudentAge(List < Student > Student, bool ascending)
{
List < Student > .sort(Comparison < Student > (Compare));
}
搞定但是这样还不支持动态切换升序和降序,我必须把ascending,传递给Compare方法,但是它是委托的函数,我不能给它加参数。所以我只能给它定义个类来传递参数。
{
private bool ascending;
public StudentComparer( bool ascending)
{
this .ascending = ascending;
}
public int Compare(Student a, Student b) // 在dotnet 2.0这个方法名可以随便
{
return (a.Age - b.Age) * (ascending ? 1 : - 1 );
}
}
接下来使用
{
StudentComparer stuComp = new StudentComparer(ascending);
List < Student > .sort(Comparison < Student > (stuComp.Compare));
}
搞定,但是没实现一种排序就要多写一个类,想死。而且在dotnet2.0 写类仅仅是为了传一个参数而已 。dotnet1.1只能是写类。
dotnet3.5的写法,那真的是春天来了。体现出动态语言优点和简洁。
{
public int Age
{
get ; set ;
}
public string Name
{
get ; set ;
}
}
接下来就是支持升序和降序的排序了。
{
List < Student > .sort((a ,b ) => ( a.Age - b.Age ) * ( ascending ? 1 : - 1 )); // Lambda表达式
}
当然,我们还可以用Dotnet3.5的linq实现排序,那更简单更快。
{
new Student{Age = 28 ,Name = " ZHANGSAN " },
new Student{Age = 18 ,Name = " Lisi " },
new Student{Age = 23 ,Name = " Wangwu " }
};
var res = list.OrderByDescending(S => S.Age).GetEnumerator(); // 降序
// 升序 var res = list.OrderBy(S => S.Age).GetEnumerator();
while (res.MoveNext())
{
Console.WriteLine(res.Current.Age + " " + res.Current.Name);
}
搞定,呵呵。不用怕,要有开放的编程思想,如果你不能接受,就只能淘汰。写多了js的伪oop或者python ruby,那么自然也就习惯了。写累了。。