实现比较器接口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 ...
随机推荐
- How to resolve "your security settings have blocked an untrusted application from running" in Mac
If you encounter the error "your security settings have blocked an untrusted application from r ...
- POJ3046--Ant Counting(动态规划)
Bessie was poking around the ant hill one day watching the ants march to and fro while gathering foo ...
- SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件
我们为什么要修改呢,这是因为我们查询的时候,我们有时候需要连表查询,例如我们需要查询出员工表的信息(emp_id,emp_name...)与此同时,我们还想查询出该员工所在的部门(dept_name) ...
- hdu 1716 排列
题目 这道题是全排列问题,主要注意的是格式问题.觉得下面这种写法最为巧妙 #include <cstdio> #include <iostream> #include < ...
- PHP搜索 搜索 搜索
//搜索界面 public function search(){ $param=input('param.'); $where=[]; //搜索框 if(!empty($param['content' ...
- python模块补充
一.模块补充 configparser 1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -opti ...
- bootstrap1相关学习文档
<em>Bootstrap 框架</em> //倾斜 4.对齐 //设置文 ...
- NTP 服务器搭建
FROM:http://blog.sina.com.cn/s/blog_511b46d10100agzf.html 配置环境: 1. 假设在 192.168.0.0 网段内,要以IP为 10.233. ...
- 分形之皇冠(Crown)
皇冠分形曲线 核心代码: static void FractalCrown(const Vector3& vStart, const Vector3& vEnd, Vector3* p ...
- 用一个应用场景理解ASP.NET Core Identity是什么?
目录 前言 基于声明的认证(Claims-based Authentication) 应用场景一 在ASP.NET Core 中Identity是如何实现的 类ClaimsPrincipal 考察另外 ...