• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C# 中的List.Sort()–集合排序方法全面解析

c# 搞代码 4年前 (2022-01-09) 21次浏览 已收录 0个评论
文章目录[隐藏]

在C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数、多规则的复杂排序。

下面是C#自定义排序的4种方法:

List<T>.Sort();   
List<T>.Sort(IComparer<T> Comparer);
List<T>.Sort(int index, int count, IComparer<T> Comparer);
List<T>.Sort(Comparison<T> comparison);

实现目标

假设存在一个People类,包含Name、Age属性,在客户端中创建List保存多个实例,希望对List中的内容根据Name和Age参数进行排序,排序规则为,先按姓名升序排序,如果姓名相同再按年龄的升序排序:

class People
{
 public People(string name, int age) { Name = name; Age = age; }
 public string Name { get; set; } //姓名
 public int Age { get; set; } //年龄
}
 
// 客户端
class Client
{
 static void Main(string[] args)
 {
  List<People> peopleList = new List<People>();
  peopleList.Add(new People("张三", 22));
  peopleList.Add(new People("张三", 24));
  peopleList.Add(new People("李四", 18));
  peopleList.Add(new People("王五", 16));
  peopleList.Add(new People("王五", 30));
 }
}

方法一、对People类继承IComparable接口,实现CompareTo()方法

该方法为系统默认的方法,单一参数时会默认进行升序排序。但遇到多参数(Name、Age)排序时,我们需要对该默认方法进行修改。

方法本文来源gao@daima#com搞(%代@#码@网&一:People类继承IComparable接口,实现CompareTo()方法

IComparable<T>:定义由值类型或类实现的通用比较方法,旨在创建特定于类型的比较方法以对实例进行排序。

原理:自行实现的CompareTo()方法会在list.Sort()内部进行元素两两比较,最终实现排序

class People : IComparable<People>
{
 public People(string name, int age) { Name = name;Age = age; }
 public string Name { get; set; }
 public int Age { get; set; }
 
 // list.Sort()时会根据该CompareTo()进行自定义比较
 public int CompareTo(People other)
 {
  if (this.Name != other.Name)
  {
   return this.Name.CompareTo(other.Name);
  }
  else if (this.Age != other.Age)
  {
   return this.Age.CompareTo(other.Age);
  }
  else return 0;
 }
}
 
// 客户端
peopleList.Sort();
 
// OUTPUT:
//  李四 18
//  王五 16
//  王五 30
//  张三 22
//  张三 24

方法二:增加People类的外部比较类,继承IComparer接口、实现Compare()方法

区别于上述继承IComparable的方法,该方法不可在People内继承实现IComparer接口,而是需要新建比较方法类进行接口实现

方法二:新建PeopleComparer类、继承IComparer接口、实现Compare()方法

原理:list.Sort()将PeopleComparer类的实例作为参数,在内部使用Compare()方法进行两两比较,最终实现排序(注:上述方法为CompareTo(),此处为Compare()方法)

// 自定义比较方法类
class PeopleComparer : IComparer<People>
{
 // 区别于CompareTo()单参数,此处为双参数
 public int Compare(People x, People y)
 {
  if (x.Name != y.Name)
  {
   return x.Name.CompareTo(y.Name);
  }
  else if (x.Age != y.Age)
  {
   return x.Age.CompareTo(y.Age);
  }
  else return 0;
 }
}
 
// 客户端
// 传入参数为自定义比较类的实例   
peopleList.Sort(new PeopleComparer());
 
// OUTPUT:
//  李四 18
//  王五 16
//  王五 30
//  张三 22
//  张三 24

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C# 中的List.Sort()–集合排序方法全面解析

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址