C# 重写IComparer 接口

首先定义比较类 继承自IComparer<Racer>

 1 public class RacerComparer : IComparer<Racer>
 2     {
 3         public enum CompareType
 4         {
 5             FirstName, LastName, Country, Wins
 6         }
 7         private CompareType compareType;
 8         public RacerComparer(CompareType compareType)
 9         {
10             this.compareType = compareType;
11         }
12         public int Compare(Racer x, Racer y)
13         {
14             if (x == null && y == null) return 0;
15             if (x == null) return -1;
16             if (y == null) return 1;
17
18             int result;
19             switch (compareType)
20             {
21                 case CompareType.FirstName:
22                     return string.Compare(x.FirstName, y.FirstName);
23                 case CompareType.LastName:
24                     return string.Compare(x.LastName, y.LastName);
25                 case CompareType.Country:
26                     result = string.Compare(x.Country, y.Country);
27                     if (result == 0)
28                         return string.Compare(x.LastName, y.LastName);
29                     else
30                         return result;
31                 case CompareType.Wins:
32                     return x.Wins.CompareTo(y.Wins);
33                 default:
34                     throw new ArgumentException("Invalid Compare Type");
35             }
36         }
37     }

 1 class Racer : IComparable<Racer>
 2     {
 3         public int Id { get; private set; }
 4         public string FirstName { get; set; }
 5         public string LastName { get; set; }
 6         public string Country { get; set; }
 7         public int Wins { get; set; }
 8         public override string ToString()
 9         {
10             return String.Format("{0} {1}", FirstName, LastName);
11         }
12         public Racer(int id, string firstName, string lastName, string country)
13             : this(id, firstName, lastName, country, wins: 0)
14         {
15         }
16         public Racer(int id, string firstName, string lastName, string country, int wins)
17         {
18             this.Id = id;
19             this.FirstName = firstName;
20             this.LastName = lastName;
21             this.Country = country;
22             this.Wins = wins;
23         }
24         public int CompareTo(Racer other)
25         {
26             if (other == null) return -1;
27             int compare = string.Compare(this.LastName, other.LastName);
28             if (compare == 0)
29                 return string.Compare(this.FirstName, other.FirstName);
30             return compare;
31         }
32     }

调用比较方法

1  var graham = new Racer(7, "Graham", "Hill", "UK", 14);
2             var emerson = new Racer(13, "Emerson", "Fittipaldi", "Brazil", 14);
3             var mario = new Racer(16, "Mario", "Andretti", "USA", 12);
4
5             var racers = new List<Racer>(20) { graham, emerson, mario };
6  racers.Sort(new RacerComparer(RacerComparer.CompareType.Country));

时间: 2024-08-03 09:44:54

C# 重写IComparer 接口的相关文章

C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口不失为一个好办法. IComparable.CompareTo 方法 在MSDN上是这么解释(机器翻译过来)的: IComparable接口:定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序. IComparer接口:公开一种比较两个对象的方法. 详细理解就是: 在默认情况

C# List&lt;&gt; 实现 IComparer 接口 排序

C# 的 List<> 容器提供了  IComparer 接口 来让使用者可以灵活的对 容器进行排序. 下面通过对一个背包 List<> 进行以下规则排序: 1.首先按道具类型排序 2.类型相同然后按道具品级排序 3.品级相同然后按等级排序 转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn using System; using System.Collections.Generic; using System.Te

IComparable和IComparer接口

C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象. public int CompareTo(object o) {} 若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比

对象的比较与排序:IComparable和IComparer接口

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: 1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象. 2. IComparer 在一个单独的类中实现,可以比较任意两个对象. 先看 IComparable 这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法

多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { publ

IComparable和IComparer接口的简析

默认情况下,对象的Equals(object o)方法是比较两个对象是否引用同一个对象.如果我们有自己的对象,就要自己定义对象比较方式: 1.IComparable在要比较的对象(类的实例化就是对象)类中实现,可以比较该对象和另一个对象. 2.IComparer在一个单独的类中实现,可以任意比较两个对象. 通俗的讲,IComparable是能够比较,具备比较的能力.比如说某个人具备编程的能力,如果需要对编程能力的高低进行比较的话,就必须在自己的类中去实现怎么具体的方法.IComparer是比较者

实现IComparable、IComparer接口

using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparable<Employee> { public int EmpID; public string YearsOfSvc = "1"; public Employee(int id) { EmpID = id; } public Employee(int id , string ys

c# IComparable与IComparer接口

原文地址:https://www.cnblogs.com/fanweisheng/p/11517698.html

C# FTP常规方法

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;using System.Collections;using System.Diagnostics;using Dare.DN.Servi