C# List.Sort与IComparer接口及Comparison委托应用于集合排序
C#里List.Sort的用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ListSort
{
class Program
{
static void Main(string[] args)
{
List<C> L = new List<C>();
L.Add(new C { n = 1, s = "b" });
L.Add(new C { n = 3, s = "a" });
L.Add(new C { n = 2, s = "c" });<br>
// 方法1 使用Comparison<T>委托。
L.Sort((left, right) =>
{
if (left.n > right.n)
return 1;
else if (left.n == right.n)
return 0;
else
return -1;
}); // 方法2 使用IComparer<T>接口。
L.Sort(new CComparer()); // 方法3 除以上两种方法以外还可以使用另一种方法,在C类中实现IComparable<T>
L.Sort();
}
}
//方法二
public class CComparer : IComparer<C>
{
public int Compare(C left, C right)
{
if (left.n > right.n)
return 1;
else if (left.n == right.n)
return 0;
else
return -1;
}
}
//方法三
public class C : IComparable<C>
{
public int n;
public string s; public int CompareTo(C other)
{
if (this.n > other.n)
return 1;
else if (this.n == other.n)
return 0;
else
return -1;
}
}
}
IComparer接口及Comparison委托应用于集合排序
需要对list进行排序,可以用list.Sort()方法。该方法有多个重载。
(1)使用IComparer<T>接口
可以为Sort传入IComparer<T>的实现类的实例对象,该接口为:
public interface IComparer<in T>
{ //如果x小于y,则返回负数;x大于y,返回正数;等于则返回0
int Compare(T x, T y); }
void Sort(IComparer<T> comparison);
如果使用IComparer<T>实现类的实例对象,则需要实现定义好实现类,对于已经定义好的,则比较方便,否则相对麻烦一些。
(2)使用Comparison<T>委托
但是对于没有定义IComparer<T>的实现类的场合,可以使用更为方便的方式,即使用Comparison<T>委托作为参数。
public delegate int Comparison<in T>(T x, T y);
void Sort(Comparison<T> comparison);
具体使用时,可以直接传入委托(或函数名称),也可以直接使用numda表达式。以下是使用Lambda表达式的方法代码:
List<Student> list=new List<Student>(); //Student类中含有Age属性
list.AddRange(....); //添加数据 //以下对Student集合按照其Age属性从小到大排序
list.Sort( (x, y) =>
{
if (x.Age < y.Age)
{
return -1;
}
else if (x.Age > y.Age)
{
return 1;
}
else
return 0;
}
); //或者以下更加简单的写法
list.sort((x,y)=>x.Age.CompareTo(y.Age));
https://www.cnblogs.com/talentzemin/p/3930368.html
https://blog.csdn.net/jiuzaizuotian2014/article/details/82425521
C# List.Sort与IComparer接口及Comparison委托应用于集合排序的更多相关文章
- Icomparer和Icomparable集合排序
c#中实现对象集合的排序可以使用ArrayList中的Sort()方法,而有比较才能谈排序,因为不是基本类型(如string ,int.double......等)所以.NET Framework不可 ...
- C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法
在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口 ...
- IComparable和IComparer接口
C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表 ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
- [0] 关于IComparable和IComparer接口和Comparer类
关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...
- Java中使用Collections.sort()方法对数字和字符串泛型的LIst进行排序
在List的排序中常用的是Collections.sort()方法,可以对String类型和Integer类型泛型的List集合进行排序. 首先演示sort()方法对Integer类型泛型的List排 ...
- linux下sort命令使用详解---linux将文本文件内容加以排序命令
转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...
- C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...
- IComparable<T> Vs. IComparer<T> System.Comparison<T>
Well they are not quite the same thing as IComparer<T> is implemented on a type that is capabl ...
随机推荐
- 【Problem】前端项目运行:Module build failed:Error Node Sass does not yet support my current environmen
我在运行renren-fast-vue前端项目时,安装完依赖cnpm install 启动服务npm run dev 出现问题. Module build failed: Error: Node Sa ...
- ABAP 多表联合查询
inner join(等值连接) 只返回两个表中联结字段相等的行left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) 返回包括右表中的所有记录 ...
- consul是什么?
consul概念: consul是用来做注册中心的 他和eureka是一样的 注册中心一般都是集群的形式存在保证高可用 consul像是一个nosql 存储着键值对 可以做存储consul是c/s架构 ...
- Windows下的python虚拟环境设置
Windows下的python虚拟环境设置: virtualenv 在python开发中,我们可能会遇到一种情况:就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲 ...
- CoeMonkey少儿编程第4章 变量
点击这里,现在就开启CodeMonkey的趣味编程之旅. 目标 了解什么是变量 了解变量的命名规则 掌握如何使用变量 变量 什么是变量?顾名思义,变量就是可以变化的量. 和变量相对的是常量,即不可变化 ...
- 性能测试WAS内存使用的探索和分析
性能测试中,CPU和内存是关注最多的两个性能指标.以我行应用最多的系统架构(WAS+Oracle)来说,CPU使用率高的问题多发生于数据库,比如索引不当引发的表扫描.绑定变量使用不当引发的硬解析.连接 ...
- Linux系统设置 SSH 通过密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者 ...
- jQuery 留言表单验证
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 服务器端IO模型的简单介绍及实现 阻塞 / 非阻塞 VS 同步 / 异步 内核实现的拷贝效率
小结: 1.在多线程的基础上,可以考虑使用"线程池"或"连接池","线程池"旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲 ...
- 【转载】【网络安全】渗透中 PoC、Exp、Payload 与 Shellcode 的区别
原文地址 渗透中 PoC.Exp.Payload 与 Shellcode 的区别 概念 PoC,全称"Proof of Concept",中文"概念验证",常指 ...