C# 中的泛型排序器[一]
1.创建实体类:ClassInfo,默认想要对其按照班级学生数量进行排序
public class ClassInfo { /// <summary> /// 班级名称 /// </summary> public string ClassName { get; set; } /// <summary> /// 学生数量 /// </summary> public int StudentCount { get; set; } }
2.在控制台程序Main方法中,插入代码
List<ClassInfo> classList = new List<ClassInfo>(); classList.Add( new ClassInfo() { ClassName = "小一班", StudentCount = 40 }); classList.Add(new ClassInfo() { ClassName = "小二班", StudentCount = 39 }); foreach(var o in classList){ Console.WriteLine(string.Format("{0}:{1}", o.ClassName, o.StudentCount)); } Console.ReadKey();
运行后,发现是按照增加对象的顺序来显示的。
3.尝试使用对象默认的Sort进行排序
classList.Sort();
报错,错误信息提示:必须至少有一个对象实现 IComparable。那么,如何实现自定义实体类的排序呢?下面开始一一陈述。
基本概念
比较:两个实体类之间按>,=,<进行比较。
排序:在集合类中,对集合类中的实体进行排序。排序基于的算法基于实体类提供的比较函数。
C#对基本类型都提供了默认的比较和排序的算法,但比较复杂结构的实体类,需要用户自己实现比较和排序的方法
1.IComparer
在ClassInfo类中,继承接口IComparer( IComparable<ClassInfo>),并实现接口中的CompareTo方法。
public int CompareTo(ClassInfo o) { return StudentCount.CompareTo(o.StudentCount); }
运行,发现按照学生数量进行了升序显示。
注意上面代码中CompareTo方法,是利用了整型的默认比较方法。此处可以使用以下自定义代码,可以将比较器的工作原理阐述的更清楚。
if (StudentCount > o.StudentCount) return 1; else if (StudentCount == o.StudentCount) return 0; else return -1;
2.IComparer:使用IComparer来实现一个自定义的比较器
public class SortByName : IComparer<ClassInfo> { public int Compare(ClassInfo x, ClassInfo y) { return x.ClassName.CompareTo(y.ClassName); } }
将Main()中,classList.Sort()改为 classList.Sort(new SortByName());
运行后,发现集合中的数据按名称进行了排序。
3.使用lamda表达式实现比较排序:
classList.Sort((ClassInfo obj1, ClassInfo obj2) => { return obj1.ClassName.CompareTo(obj2.ClassName); });
end

浙公网安备 33010602011771号