通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; namespace ConsoleApplication1
{
/// <summary>
/// 设置FirstName和LastName两个属性为排序条件,对person安姓名进行排序
/// </summary>
public class Person : IComparable
{
private string _firstName;
/// <summary>
/// 第一个字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二个字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person(string firstName, string lastName)
{
_firstName = firstName;
_lastName = lastName;
}
//理解接口的作用,在这里 继承了IComparable接口,使得Person类必须实现这个接口(实现接口 就是 实现CompareTo方法,Array.Sort排序的时候 只认CompareTo方法,如果没有继承接口,就算有这个方法 也是会抛出异常)
//实现接口后在Array中 能通过这个被实现的接口方法(规定好了是CompareTo方法),根据返回值 而去处理sort方法(在Array.Sort 中已经规定了ComapreTo方法 返回值代表的意义),这样在Person中就可以 由用户
//自己在CompareTo方法中随便的去定义 方法的实现方式,只要返回值满足 规定 即可,真是 妙极了(0相等1大于-1小于)
public int CompareTo(object obj)
{
Person other = obj as Person;
//先比较LastName,如果是0则继续比较FirstName
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
} class Program
{
static void Main(string[] args)
{
Person[] persons = { new Person("z","l"),
new Person("w","x"),
new Person("l","s"),
new Person("l","m"),
new Person("a","l")};
Array.Sort(persons);//排序
foreach (Person p in persons)
{
Console.WriteLine(p);
} }
}
}

上面的情况是 可以对 Person类进行修改的情况下的做法,如果不能修改Person呢,这个时候就要IComparer接口大显身手了

利用了Sort方法的重载,添加一个对IComparer接口的实现的接口即可


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; namespace ConsoleApplication1
{
/// <summary>
/// 设置FirstName和LastName两个属性为排序条件,对person安姓名进行排序
/// </summary>
public class Person //: IComparable
{
private string _firstName;
/// <summary>
/// 第一个字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二个字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person(string firstName, string lastName)
{
_firstName = firstName;
_lastName = lastName;
}
//理解接口的作用,在这里 继承了IComparable接口,使得Person类必须实现这个接口(实现接口 就是 实现CompareTo方法,Array.Sort排序的时候 只认CompareTo方法,如果没有继承接口,就算有这个方法 也是会抛出异常)
//实现接口后在Array中 能通过这个被实现的接口方法(规定好了是CompareTo方法),根据返回值 而去处理sort方法(在Array.Sort 中已经规定了ComapreTo方法 返回值代表的意义),这样在Person中就可以 由用户
//自己在CompareTo方法中随便的去定义 方法的实现方式,只要返回值满足 规定 即可,真是 妙极了(0相等1大于-1小于)
public int CompareTo(object obj)
{
Person other = obj as Person;
//先比较LastName,如果是0则继续比较FirstName
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}
/// <summary>
/// 架设Person是不允许我们去修改的,这个时候我们就用IComparer接口,然后Sort根据被实现的Compaer方法去排序
/// </summary>
public class PersonComparer : IComparer
{
/// <summary>
/// 枚举,排序条件
/// </summary>
public enum PersonCompareType
{
/// <summary>
/// 第一个名字
/// </summary>
FirstName,
LastName
}
private PersonCompareType compareType;
public PersonComparer(PersonCompareType compareType)
{
this.compareType = compareType;
}
public int Compare(object x, object y)
{
Person p1 = x as Person;
Person p2 = y as Person;
switch (compareType)
{
case PersonCompareType.FirstName:
return p1.FirstName.CompareTo(p2.FirstName); case PersonCompareType.LastName:
return p1.LastName.CompareTo(p2.LastName); default:
throw new ArgumentException("必须指定比较类型");
} }
} class Program
{
static void Main(string[] args)
{
Person[] persons = { new Person("z","l"),
new Person("w","x"),
new Person("l","s"),
new Person("l","m"),
new Person("a","l")};
Array.Sort(persons);//排序
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------");
//注意这个地方的方法重载
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.FirstName));
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------");
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.LastName));
foreach (Person p in persons)
{
Console.WriteLine(p);
} }
}
}

C# 用实例来理解IComparable和IComparer的更多相关文章

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

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

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

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

  3. C# 中的IComparable和IComparer

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

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

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

  5. servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1

    servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼     servlet的非线程安全,action的线程安全 对提交 ...

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

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

  7. 使用LINQ查询数据实例和理解

    使用LINQ查询数据实例和理解 var contacts= from customer in db.Customers where customer.Name.StartsWith("A&q ...

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

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

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

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

随机推荐

  1. Python9-MySQL索引-外键-day43

    1.以ATM引出DBMS2.MySQL -服务端 -客户端3.通信交流 -授权 -SQL语句 -数据库 create database db1 default charset=utf8; drop d ...

  2. Codeforces:68A-Irrational problem(暴力大法好)

    A- Irrational problem p Time Limit: 2000MS Memory Limit: 262144K 64bit IO Format: %I64d& %I64 De ...

  3. 动态规划:HDU2571-命运

    解题心得: 1.其实是一个简单的动态规划加上贪心的思想,思路简单,只需要求每一步的最大值就可以了,但是要注意读懂题. 2.走的规则:从左上角开始走,达到右下角,只能向右走一步,或者向下走一步,或者走列 ...

  4. Benelux Algorithm Programming Contest 2014 Final

    // Button Bashing (bfs) 1 #include <iostream> #include <cstdio> #include <cstring> ...

  5. nova boot添加volume_type参数支持

    早前由于添加了全SSD的高性能Ceph集群,区别于现有的HDD集群,在OpenStack端需要能够选择使用两种集群.Cinder配置多Ceph后端的文档早已整理,整理文件夹时发现这篇为nova boo ...

  6. Intellij Idea 创建JavaWeb项目

    折腾Tomcat折腾了两个晚上,第一个晚上怎么都进不了Tomcat的首页,第二个晚上进去了,但是新建的Web项目,在浏览器中运行,总是 Error on Apache Tomcat: The requ ...

  7. RDLC Reporting in Visual Studio 2017

    原文:RDLC Reporting in Visual Studio 2017 Visual Studio 2017 中可以使用 RDLC Reporting 插件来设计报表,SAP Crystal ...

  8. C# datagridview列绑定类中类的属性

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://www.cnblogs.com/linghaoxinpian/p/5906374. ...

  9. CQRS之旅——旅程3(订单和注册限界上下文)

    旅程3:订单和注册限界上下文 CQRS之旅的第一站 "寓言家和鳄鱼是一样的,只是名字不同" --约翰·劳森 描述: 订单和注册上下文有一部分职责在会议预订的过程中,在此上下文中,一 ...

  10. vue/vux编译时出现 unexpected token <11:0-485>

    最近开发Vux项目,一直使用VS Code开发工具,可以格式化里面的<script>代码的: 但是今天突然无法格式化代码,而且编译报错.主要提示类似:unexpected token  & ...