C#类型对象间的排序方式

在C#语言中,要使类型对象可以排序,可以基于接口实现,主要的接口有IComparable<T>、IComparer<T>,当然我们还可以通过强大的LINQ进行排序。

IComparable<T>接口

IComparable<T>定义由值类型或类实现的通用比较方法,以为排序实例创建类型特定的比较方法。该接口就一个CompareTo(T)方法,将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中的位置是位于另一个对象之前、之后还是与其位置相同。

相关链接:https://msdn.microsoft.com/zh-cn/library/4d7sx9hd(v=vs.110).aspx

示例定义了一个学生类型

class Student : IComparable<Student>
    { 
public string Id { get; set; } 
public string Name { get; set; } 
public float Height { get; set; } 
public override string ToString() { 
return string.Format("{0} {1} {2:#0.00}", Name, Id, Height);
        } 
//基于学生身高进行排序 public int CompareTo(Student other) { 
if(Height == other.Height) return 0; 
else if(Height > other.Height) return 1; 
else return -1;
        }
    }
var students = new List<Student>() { 
new Student() { Id="0001",Name="张三",Height= 1.76f}, 
new Student() { Id="0004",Name="李四", Height=1.72f}, 
new Student() { Id="0003",Name="王五",Height=1.80f}, 
new Student() { Id="0005",Name="赵六",Height=1.69f}
  };
  Console.WriteLine("==========排序前==========="); 
foreach(var item in students) {
      Console.WriteLine(item);
  }
  students.Sort();//排序 
Console.WriteLine("==========排序后==========="); foreach(var item in students) {
      Console.WriteLine(item);
  }
  Console.ReadKey(true);

IComparer<T>接口

IComparer<T>接口定义了两个对象的比较方法,接口包含的方法Compare(T, T)对两个对象进行比较,并返回指示一个是否小于、 等于还是大于另一个值。
使用IComparer<T>接口的好处在于可以定义多种对象的排序规则,并可以根据需要动态的配置排序方式。

相关链接:https://msdn.microsoft.com/zh-cn/library/8ehhxeaf(v=vs.110).aspx

实现基于学生Id和身高进行排序的规则

class StudentCompareWithId : IComparer<Student>
    { public int Compare(Student x, Student y) { return string.Compare(x.Id, y.Id);
        }
    } class StudentCompareWithHeight : IComparer<Student>
    { public int Compare(Student x, Student y) { if(x.Height == y.Height) return 0; 
else if(x.Height > y.Height) return 1; 
else return -1;
        }
    }
var students = new List<Student>() {
 new Student() { Id="0001",Name="张三",Height= 1.76f}, 
new Student() { Id="0004",Name="李四", Height=1.72f}, 
new Student() { Id="0003",Name="王五",Height=1.80f}, 
new Student() { Id="0005",Name="赵六",Height=1.69f}
 };
 Console.WriteLine("==========排序前==========="); 
foreach(var item in students) {
     Console.WriteLine(item);
 }
 students.Sort(new StudentCompareWithId());//基于Id排序 
Console.WriteLine("==========基于Id排序==========="); 
foreach(var item in students) {
     Console.WriteLine(item);
 }

 students.Sort(new StudentCompareWithHeight());
//基于Height排序 
Console.WriteLine("==========基于Height排序==========="); 
foreach(var item in students) {
     Console.WriteLine(item);
 }

LINQ及扩展方法

通过LINQ及扩展方法对对象序列进行排序就更简单了,只需一行代码就搞定,当然他们只是写法上的不同。
【LINQ】

var query = from s in students orderby s.Height select s;

【扩展方法】
LINQ扩展方法中的OrderBy()根据某个键按升序对序列的元素进行排序;OrderByDescending()降序排序。

var query = students.OrderBy(o => o.Height);

最后

实现类型对象序列的排序,如果是复杂的排序规则可以选择继承接口实现排序规则然后再调用序列的排序方法,如果只是想简单的依赖对象的某个成员进行排序,通过LINQ及扩展方法是个很好的选择。