1.List<Student>默认排序

为类创建默认排序实现IComparable,此代码的实现为年龄升序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IComparable_And_IComparer.Model
{
/// <summary>
/// 学生类
/// </summary>
/*
如果需要对类进行排序,那么我们需要实现IComparable接口中的CompareTo比较方法
*/
public class Student : IComparable<Student>
{
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 学号
/// </summary>
public string No { get; set; } /*
需要注意的是此比较方法为
:本身对象与另一对象做比较
如果返回为大于等于1:则认为本身对象(this)应排列在后
如果返回为小于等于-1:则认为本身对象应排列在前(0开始为前)
如果返回为等于0:则认为此对象本身比较对象位置不变
所以可以根据此方式去实现升序和降序 如果只是使用,只要记住 this.xxx.CompareTo(other.xxx)为升序;other.xxx.CompareTo(this.xxx)为降序 以下内容(可无视) 均为钻牛角尖思考:
理解说明:由于所有元素都会进行比较,都会以this进行比较,
* (升序)所以如果需要大的排在后面 我们只需要CompareTo返回时规定如果本身大于比较的值(也就是说如果我们选择 本身减去比较 那么表示我们需要本身大于比较的值排在后面){ 因为如果本身是大于的话,那么值就会排到后面,小于的话值就会到前面去}
* (降序)所以如果需要大的排在后面 我们只需要CompareTo返回时规定如果本身小于比较的值
*
*
* 初略辅助理解:因为最终所有元素都会进行比较(也就是所有元素都会成为this)
* 如果是this.Age.CompareTo(other.Age);
* 因为
* 如果本身大于比较的值,那么则会到后面去
* 小于则排到前面去
* 而因为认为所有元素都会成为this所以所有元素大的都会到后面去
*/
/// <summary>
/// 实现排序
/// </summary>
/// <param name="other">比较的对象</param>
/// <returns>
/// 等于0:相等 (表示与做比较的对象相等);
/// 大于等于1:大于(表示大于比较的对象);
/// 小于等于-1:小于(表示小于比较的对象);
/// </returns>
public int CompareTo(Student other)
{
//if (this.Age > other.Age)
// return 1;
//else if (this.Age == other.Age)
// return 0;
//else
// return -1; //return this.Age - other.Age; //本身大于比较的对象,排于后面
return this.Age.CompareTo(other.Age);//希望大于的排在后面(升序)
//return this.Age.CompareTo(other.Age);//希望小于的排在后面(降序)
}
}
}

使用:

List<Student> list= new List<Student>()
{
new Student() { Age = , Name = "B", No = "A002" },
new Student() { Age = , Name = "A1", No = "A001" },
new Student() { Age = , Name = "A2", No = "A0010" },
new Student() { Age = , Name = "A3", No = "A0015" },
new Student() { Age = , Name = "A4", No = "A0016" },
new Student() { Age = , Name = "A5", No = "A0011" },
new Student() { Age = , Name = "A9", No = "A0012" },
new Student() { Age = , Name = "A11", No = "A0013" },
new Student() { Age = , Name = "A12", No = "A0014" },
}; list.Sort();

2.List<Student> 使用自定义排序比较器实现多种排序方式(需要多少种排序方式就需要定义多少个类去实现接口):实现IComparer接口

using IComparable_And_IComparer.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IComparable_And_IComparer.SortComparer
{
/// <summary>
/// 有泛型的接口,应该明确表明类型,否则为object
/// 会造成拆箱与装箱问题
/// </summary>
public class NameASC : IComparer<Student>
{
/// <summary>
/// 相关注释描述参考Student类,Student类中this为此方法中x
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
}
}

使用:

list.Sort(new NameASC());

3.linq动态排序

       if (true)
list = (from p in list
//orderby 后面需要接上值,来让其为每条数据作比较
orderby GetPropertyValue(p, txtFieldOrder.Text) ascending
select p).ToList();
else
list = (from p in list
//orderby 后面需要接上值,来让其为每条数据作比较
orderby GetPropertyValue(p, txtFieldOrder.Text) descending
select p).ToList();      /// <summary>
/// 获取一个对象的属性值
/// </summary>
/// <param name="obj">对象</param>
/// <param name="property">属性名</param>
/// <returns></returns>
private static object GetPropertyValue(object obj, string property)
{
System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
return propertyInfo.GetValue(obj, null);
}

比较和排序 IComparable And IComparer的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. C# 中的IComparable和IComparer

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

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

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

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

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

  9. 对象的比较与排序:IComparable和IComparer接口

    IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...

随机推荐

  1. 在JSTL EL中处理java.util.Map,及嵌套List的情况

    关联的键查找存储在映射中的值. 在方括号中指定键,并将相应的值作为表达式的值返回.例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" ...

  2. Python2.7.3 学习——准备开发环境

    安装环境搭建参考:http://blog.163.com/sunshine_linting/blog/static/4489332320129187464222/ 第一种方式,通过命令行方式安装Pyt ...

  3. 关注SSO

    https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml 其余的看osc ...

  4. 315M无线发射模块天线的长度计算

    波长=光速/频率=300/315=0.952米 1/4波长须要的天线长度=波长*1/4=0.952/4=0.238米 考虑导线传播高频信号的缩短率在0.98左右,因此天线长度=0.238*0.98=0 ...

  5. iPhone开发之全局变量的使用

    全局变量历来就是很好的东西,能够在开发中带来很多方便,下面来介绍一下iPhone中软件开发时全局变量的使用方法: 一.新建Constants.h文件(文件名根据需要自己取),用于存放全局变量: 二.在 ...

  6. MVC5.0 中如何提高Controller 的优先级

    //在area下建立的Home namespace WebApplication8.Areas.Weather.Controllers { public class HomeController : ...

  7. Google Maps 学习笔记(一)2014.06.04

    1.<body onload="加载地图的函数" onunload="GUnload()"> 2.new GMap2(container,opts) ...

  8. uploadify 使用 详细 说明

    简单 常用的 时间 有点 紧  先写 这点 ,  有时间 在更新 下面有 例子  链接 不过要 自己 摘 一下 很简单的啦   <script type="text/javascrip ...

  9. js动画学习(五)

    九.多属性同时运动 前面的例子都是每个属性单独运动,如果想要多属性同时运动怎么办?比如,我想要一个div的onmouseover事件中宽和高同时变化.下面这个函数是单独变宽: window.onloa ...

  10. iOS 设置状态栏的颜色

    1.在plist文件中设置如下属性: 2.在delegate中设置 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarSt ...