准备工作:

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

C# 比较和排序(IComparable和IComparer以及它们的泛型实现)的更多相关文章

  1. 比较和排序(IComparable和IComparer以及它们的泛型实现)(转)

    C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现) 本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparabl ...

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

    本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和ICompare ...

  3. 比较和排序 IComparable And IComparer

    1.List<Student>默认排序 为类创建默认排序实现IComparable,此代码的实现为年龄升序 using System; using System.Collections.G ...

  4. 数组自定义排序:IComparable和IComparer接口

    首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...

  5. c# 实现IComparable、IComparer接口、Comparer类的详解

    在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...

  6. C# 常用接口学习 IComparable 和 IComparer

    C# 常用接口学习 IComparable 和 IComparer 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 201 ...

  7. C# 中的IComparable和IComparer

    前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...

  8. [0] 关于IComparable和IComparer接口和Comparer类

    关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...

  9. C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)

    (1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...

随机推荐

  1. .NET Core WEB API中接口参数的模型绑定的理解

    在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...

  2. h5微信支付在微信内页使用微信公众号支付

    由于app的迭代,原本的微信支付是使用原生写的 然后h5这边做交互,现在需要修改使用h5的微信支付,于是就有了现在的这个例子,微信支付其实对于我们前端来说就是调用接口然后,根据链接进行支付,其中有点坑 ...

  3. VSCode中使用vue项目ESlint验证配置

    如果在一个大型项目中会有多个人一起去开发,为了使每个人写的代码格式都保持一致,就需要借助软件去帮我们保存文件的时候,自己格式化代码 解决办法:vscode软件下载一个ESLint,在到设置里面找到se ...

  4. EDB日志配置-慢sql记录分析

    1.打开:/postgresql的安装目录/data/postgresql.conf 2.找到并更改以下属性,其他的是方便观察设置的,注意要将属性前面的注释符'#'去掉才能生效 ★★★log_dest ...

  5. 老男孩九期全栈Python之基础一

    ---恢复内容开始--- day1 12.while 体验while的执行方式和效果,用多种方法输出1~100 while 1: print('我们不一样') print('在人间') print(' ...

  6. SQL基本介绍

    SQL学习资料来源:http://www.w3school.com.cn/sql/index.asp SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL?SQL 指结构化查询语言SQL ...

  7. 6种纯css实现loading效果

    1. <div id="loadingWrap1"> <span></span> <span></span> <s ...

  8. javascript 十进制转换为二进制

    1.十进制转换为二进制 var toBin = (n) => { if(n == 0) return '0'; var res = ''; while(n != 0) { res = n % 2 ...

  9. 深入理解hashCode

    1.hashCode的概念 (1)hashCode方法是Object类的方法,在Java里所有类都默认继承Object类,即所有类都有hashCode方法. (2)hashCode是jdk根据对象的存 ...

  10. --save-dev --save 的区别

    --save 是发布会还在使用 --save-dev 是在开发中需要用到的 --save 依赖的文件在denpendencis下 --save-dev 依赖的文件都在dvedependencis下