实现比较器接口IComparable<T>,让自定义类型数组也能排序
using System; namespace LinqDemo1
{
class Program
{
static void Main(string[] args)
{
Person[] persons =
{
new Person {FirstName = "Damon", LastName = "Hill"},
new Person {FirstName = "Niki", LastName = "Lauda"},
new Person {FirstName = "Ayrton", LastName = "Senna"}
};
Array.Sort(persons);//现在可以比较了
foreach (var p in persons)
{
Console.WriteLine(p);
} Console.ReadKey();
}
} class Person : IComparable<Person>
{
public int CompareTo(Person other)
{
if (other == null)
{
return ;
}
int result = string.Compare(this.LastName, other.LastName);
if (result == )
{
result = string.Compare(this.FirstName, other.FirstName);
}
return result;
} public override string ToString()
{
return string.Format("{0} {1}", FirstName, LastName);
} public string FirstName { get; set; }
public string LastName { get; set; }
}
}
但有时候Person类是别人的类,无法修改,那怎么办呢?
在这种情况下,就可以定义一个新类,如:PersonComparer继承IComparer<Person>
using System;
using System.Collections;
using System.Collections.Generic; namespace LinqDemo1
{
class Program
{
static void Main(string[] args)
{
Person[] persons =
{
new Person {FirstName = "Damon", LastName = "Hill"},
new Person {FirstName = "Niki", LastName = "Lauda"},
new Person {FirstName = "Ayrton", LastName = "Senna"}
};
Array.Sort(persons, new PersonComparer(PersonCompareType.FirstName)); foreach (var p in persons)
{
Console.WriteLine(p);
} Console.ReadKey();
}
} public enum PersonCompareType
{
FirstName,
LastName
} public class PersonComparer : IComparer<Person>
{
private PersonCompareType compareType; public PersonComparer(PersonCompareType compareType)
{
this.compareType = compareType;
} public int Compare(Person x, Person y)
{
if (x == null && y == null) return ;
if (x == null) return ;
if (y == null) return -; switch (compareType)
{
case PersonCompareType.FirstName:
return string.Compare(x.FirstName, y.FirstName);
case PersonCompareType.LastName:
return string.Compare(x.LastName, y.LastName);
default:
throw new ArgumentException("unexpected compare type");
} }
} public class Person
{
public override string ToString()
{
return string.Format("{0} {1}", FirstName, LastName);
} public string FirstName { get; set; }
public string LastName { get; set; }
}
}
Array 类还提供了Sort()多个重载方法,它需要将一个委托作为参数,这个参数可以传递给方法,从而比较2个对象,而不需要依赖IComparable或IComparer接口,也就是说上面都白折腾了,有更高级的做法!那就是委托!
实现比较器接口IComparable<T>,让自定义类型数组也能排序的更多相关文章
- [c#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- C# 泛型集合的自定义类型排序
一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...
- C#自定义类型数组排序
在数组或者集合中对自定义类型进行排序分为两种方法. 1.如果这个自定义类型是自己定义编写的,那么我可以使它继承ICompareable<T>接口,实现其中的CompareTo(Object ...
- java利用自定义类型对树形数据类型进行排序
前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...
- java编程排序之自定义类型的集合,按业务需求排序
自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object ...
- IComparable接口实现自定义类型的排序
IComparable接口实现自定义类型的排序 CompareTo(Object) 方法的实现必须返回有三个值之一 如下表中所示. 返回值 参数比较 大于0 x>y 等于0 x=y 小于0 ...
- WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型
首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...
- C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...
- java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal
一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String ...
随机推荐
- Swagger UI教程 API 文档神器 搭配Node使用
ASP.NET Web API 使用Swagger生成在线帮助测试文档 Swagger 生成 ASP.NET Web API 前言 swagger ui是一个API在线文档生成和测试的利器,目前发现最 ...
- jvm调优的分类
本文部分内容出自https://blog.csdn.net/yang_net/article/details/5830820 调优步骤: 衡量系统现状. 设定调优目标. 寻找性能瓶颈. 性能调优. 衡 ...
- panda
这个项目很有意思,麻雀虽小五脏俱全. 页面使用rem和media query来设置字体和元素宽高image居中需要用到position 后端mysql使用阿里云的rds:nodejs的mysql模块的 ...
- Ubuntu12.04 root用户登录设置
ubuntu12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登录Ubuntu后我们需要做一些修改. 1.普通用户登录后,修改系统配置文件需要切换到超级用户模式,在 ...
- Java-动态代理技术
1.程序中的代理 为具有相同接口的目标类的各个方法,添加一些系统功能,如日志,异常处理,计算方法运行的 时间,事务管理等等,都可以交给另一个类去实现这些功能,该类称为代理类. 注意:为了让代理类共享目 ...
- node-webkit学习(1)hello world
)hello world 文/玄魂 目录 node-webkit学习(1)hello world 前言 1.1 环境安装 1.1.1 windows下的安装 1.1.2 linux环境下的安装 1 ...
- C#: 以管理员权限运行包含有cd命令的.bat文件
最近在做项目的时候遇到一种情:用C#程序以管理员权限去执行一个bat文件,且此bat文件里面有cd命令来进入文件的下一级目录,比如: echo test begin cd test1 setup1.e ...
- WPF Adorner
之前做项目时,为了实现类似微信消息数目的效果 image.png ,我之前是修改的ControlTemplate.类似于将一个带数字的控件,放在另一个控件的右上角,来实现的这个效果. 原来WPF有 ...
- MVC5控制器传值的三种方式(ViewData,ViewBag,TempData),刚刚学习MVC5的新手,希望各位大神多多指教
mvc传值的三种方式:1.ViewData 在使用过程中需要类型转换 例子: ViewData["MyTitle"]="ViewData传值"; 引用: @Vi ...
- 浏览器环境下Javascript脚本加载与执行探析之DOMContentLoaded
在”浏览器环境下Javascript脚本加载与执行探析“系列文章的前几篇,分别针对浏览器环境下JavaScript加载与执行相关的知识点或者属性进行了探究,感兴趣的同学可以先行阅读前几篇文章,了解相关 ...