图图的耳朵

C# 比较和排序(IComparable和IComparer以及它们的泛型实现)

 准备工作:

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

 

posted on 2017-11-24 11:57  图图的耳朵  阅读(1592)  评论(0编辑  收藏  举报