比较和排序 IComparable And IComparer
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的更多相关文章
- 比较和排序(IComparable和IComparer以及它们的泛型实现)
本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和ICompare ...
- 数组自定义排序:IComparable和IComparer接口
首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...
- 比较和排序(IComparable和IComparer以及它们的泛型实现)(转)
C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现) 本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparabl ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
- C# 常用接口学习 IComparable 和 IComparer
C# 常用接口学习 IComparable 和 IComparer 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 201 ...
- C# 中的IComparable和IComparer
前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...
- [0] 关于IComparable和IComparer接口和Comparer类
关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...
- C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)
(1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...
- 对象的比较与排序:IComparable和IComparer接口
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...
随机推荐
- PHP开发APP接口
第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...
- python练习之list
请用索引取出下面list的指定元素: # -*- coding: utf-8 -*- L = [ ['Apple', 'Google', 'Microsoft'], ['Java', 'Python' ...
- IOS 特定于设备的开发:监测Retina支持
近年来,Apple在其旗舰设备上引入了Retina显示屏.根据Apple的说法,他的像素密度非常高,足以使人眼无法区分单独的像素. UIScreen类提供了一种容易的方式,用于监查当前设备是否提供了内 ...
- vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)
vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...
- NAND闪存颗粒结构及工作原理
NAND闪存是一种电压元件,靠其内存电压来存储数据,现在我们就来谈谈它的结构及工作原理. 闪存的内部存储结构是金属-氧化层-半导体-场效晶体管(MOSFET),里面有一个浮置栅极(Floating G ...
- 毕业bg(dfs)
毕业bg Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- Android开发匹配字符笔记
Windows下的回车换行符是\r\n,而Linux下的回车换行符是\n 所以,在windows下可以用\r\n,而在linux下要用\n 并且还发现在linux下(既在android上开发)需要匹配 ...
- UIImageView图片视图的基本概念和使用方法
IOS学习笔记(十)之UIImageView图片视图的基本概念和使用方法(博客地址: http://blog.csdn.net/developer_jiangqq ) Author:hmjiangqq ...
- 不是技术牛人,如何拿到国内IT巨头的Offer(1)
转自:http://developer.51cto.com/art/201404/436685.htm 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...
- raphael入门到精通---属性和事件篇
属性的使用 上一篇文章我们介绍了raphael如何生成基本的图形(元素),对于每个元素来讲,我们可以添加很多的元素(attr) 下面我就来简单的介绍下元素属性的使用(path元素属性我后面单独列出来介 ...