准备工作:

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. 手动脱壳—dump与重建输入表(转)

    文章中用到的demo下载地址: http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg Lor ...

  2. PAT 1140 Look-and-say Sequence

    1140 Look-and-say Sequence (20 分)   Look-and-say sequence is a sequence of integers as the following ...

  3. centos6.0和7.4默认网卡配置

    6.0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" NM_CONTROLLED="yes&qu ...

  4. 通信技术以及5G和AI保障电网安全与网络安全

    摘 要:电网安全是电力的基础,随着智能电网的快速发展,越来越多的ICT信息通信技术被应用到电力网络.本文分析了历史上一些重大电网安全与网络安全事故,介绍了电网安全与网络安全.通信技术与电网安全的关系以 ...

  5. webform的代码设计文件莫名出错的解决

    不知道怎么回事,建立webform工程时,编译,出错,提示代码设计文件(自动生成的文件代码,不能修改)出错,提示有的对象正在使用,于是删除里面多余的对象标记,还是没用,又自动生成了. 解决办法: 1. ...

  6. Android中的Context(一)

    Android中的Context(一) 在Android开发中,Context可以说是我们接触地非常多的一个概念了,也译作"上下文",但是这个上下文到底是什么却并不好理解. 通俗的 ...

  7. Promise 错误处理

    Promise 是一个异步返回单个结果的函数或方法 不使用  `catch()` 时,在  `success handler` 里的错误无法被捕捉到 使用  `catch()` 时,在  `succe ...

  8. 获取Promise的值

    //response.text()是一个promise对象 //通过then方法获取promise存的数据 response.text().then(val => { errObj = JSON ...

  9. 编码 decode & encode

    import sys # python3 中字符编码默认为 utf-8 s = '你好' print(s) # utf-8 转为 gbk (s 默认为 unicode 所以可以直接 encode 成 ...

  10. 1ci