实现比较器接口IComparable<T>,让自定义类型数组也能排序
2017-03-05 23:52
471 查看
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 1; } int result = string.Compare(this.LastName, other.LastName); if (result == 0) { 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 0; if (x == null) return 1; if (y == null) return -1; 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接口,也就是说上面都白折腾了,有更高级的做法!那就是委托!
相关文章推荐
- TreeSet集合存放自定义类型的对象,可以使用比较器,实现Comparable接口自己设置排序方式
- 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口(转)
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- List<T>泛型数组API自带的Sort() 排序方法根据自定义排序实现
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- 实现Comparable接口对存放自定义对象列表(数组)进行排序
- 一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- 实现一个自定义字符串的排序 ,重写Comparable接口的练习!!
- Java自定义实现Comparable接口的类,实现多维排序
- 艾伟_转载:数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析
- 汗一下,.Net的单维数组自动实现IList<T>接口
- Comparable<T>接口实现
- <笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- 比较器的使用,实现 Comparable接口,功能:实现对象的多条件比较,排序
- List<>根据指定属性排序(实现IComparer接口)
- 自定义类型数组排序的两种实现方式
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析