C#对集合进行排序
作者:.NET开发菜鸟 时间:2022-06-10 02:08:03
先来看看下面List<T>泛型集合的排序例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
list.Add(1);
list.Add(5);
list.Add(2);
list.Add(6);
list.Add(3);
list.Add(4);
Console.WriteLine("*****排序前*****");
foreach (var item in list)
{
Console.WriteLine(item.ToString());
}
list.Sort();
Console.WriteLine("*****排序后*****");
foreach (var item in list)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}
}
输出结果:
从上面的截图中可以看出,Sort()方法默认按照元素的大小进行从小到大的排序,为什么调用Sort()方法就能按照元素的大小进行从小到大的排序呢?其实现原理是什么呢?我们能不能自定义排序规则呢?带着这些问题,我们先来看看Sort()方法的定义,在Sort()方法上面按F12转到定义:
从截图中可以看出,Sort()方法使用了几个重载的方法。可以传递给它的参数有泛型委托Comparison<T> comparison和泛型接口IComparer<T> comparer,以及一个范围值和泛型接口IComparer<T> comparer。只有集合中的元素实现了IComparable<T>接口,才能使用不带参数的Sort()方法。我们在这里实现IComparer<T>接口来创建一个自定义类型的排序功能。
1、定义一个Student类,包括姓名和分数两个属性,可以按照姓名或分数进行排序,Student类定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
public class Student
{
public string Name { get; set; }
public double Score { get; set; }
}
}
2、在定义一个枚举,表示排序的种类,即是按照Name排序还是按照Score排序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
/// <summary>
/// 排序的种类
/// </summary>
public enum CompareType
{
Name,
Score
}
}
3、实现IComparer接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
/// <summary>
/// StudentComparer自定义排序规则类实现IComparable接口
/// </summary>
public class StudentComparer : IComparer<Student>
{
private CompareType _compareType;
/// <summary>
/// 通过构造函数给_compareType赋值
/// </summary>
/// <param name="compareType"></param>
public StudentComparer(CompareType compareType)
{
_compareType = compareType;
}
/// <summary>
/// 实现IComparer接口的Compare
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public int Compare(Student x, Student y)
{
if (x == null && y == null)
{
return 0;
}
if (x == null)
{
return -1;
}
if (y == null)
{
return 1;
}
switch (_compareType)
{
case CompareType.Name:
return string.Compare(x.Name, y.Name);
break;
case CompareType.Score:
return x.Score.CompareTo(y.Score);
break;
default:
throw new ArgumentException("无效的比较类型");
}
}
}
}
4、在Main()方法中调用:
先按照Name进行排序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
class Program
{
static void Main(string[] args)
{
//List<int> list = new List<int>();
//list.Add(1);
//list.Add(5);
//list.Add(2);
//list.Add(6);
//list.Add(3);
//list.Add(4);
//Console.WriteLine("*****排序前*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.ToString());
//}
//list.Sort();
//Console.WriteLine("*****排序后*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.ToString());
//}
List<Student> list = new List<Student>()
{
new Student()
{
Name="Tom",
Score=98
} ,
new Student()
{
Name="Kevin",
Score=69
} ,
new Student()
{
Name="Leo",
Score=81
}
};
Console.WriteLine("*****排序前*****");
foreach (var item in list)
{
Console.WriteLine(item.Name);
}
list.Sort(new StudentComparer(CompareType.Name));
Console.WriteLine("*****排序后*****");
foreach (var item in list)
{
Console.WriteLine(item.Name);
}
//Console.WriteLine("***按照Score排序***");
Console.ReadKey();
}
}
}
结果:
在按照Score进行排序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomerSort
{
class Program
{
static void Main(string[] args)
{
//List<int> list = new List<int>();
//list.Add(1);
//list.Add(5);
//list.Add(2);
//list.Add(6);
//list.Add(3);
//list.Add(4);
//Console.WriteLine("*****排序前*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.ToString());
//}
//list.Sort();
//Console.WriteLine("*****排序后*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.ToString());
//}
List<Student> list = new List<Student>()
{
new Student()
{
Name="Tom",
Score=98
} ,
new Student()
{
Name="Kevin",
Score=69
} ,
new Student()
{
Name="Leo",
Score=81
}
};
//Console.WriteLine("*****排序前*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.Name);
//}
//list.Sort(new StudentComparer(CompareType.Name));
//Console.WriteLine("*****排序后*****");
//foreach (var item in list)
//{
// Console.WriteLine(item.Name);
//}
Console.WriteLine("*****排序前*****");
foreach (var item in list)
{
Console.WriteLine(item.Score);
}
list.Sort(new StudentComparer(CompareType.Name));
Console.WriteLine("*****排序后*****");
foreach (var item in list)
{
Console.WriteLine(item.Score);
}
Console.ReadKey();
}
}
}
结果:
来源:https://www.cnblogs.com/dotnet261010/p/9278851.html
标签:C#,集合,排序
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android消息机制Handler的工作过程详解
2023-07-31 13:49:03
![](https://img.aspxhome.com/file/2023/5/85965_0s.jpg)
Android init.rc文件详解及简单实例
2023-08-02 08:55:09
java 动态生成bean的案例
2023-08-09 02:20:05
SpringBoot 如何从配置文件读取值到对象中
2023-10-13 15:43:15
![](https://img.aspxhome.com/file/2023/3/58533_0s.png)
Android之使用Bundle进行IPC详解
2023-09-27 22:44:56
Eclipse添加xml文件提示及Hibernate配置学习
2023-08-17 05:01:47
Java 精炼解读数据结构的链表的概念与实现
2022-03-02 05:17:11
![](https://img.aspxhome.com/file/2023/3/88193_0s.png)
Kotlin伴随对象的初始化方法示例讲解
2022-07-24 05:53:06
Java7和Java8中的ConcurrentHashMap原理解析
2022-06-09 22:06:28
![](https://img.aspxhome.com/file/2023/7/66947_0s.jpg)
Java设计模式编程之解释器模式的简单讲解
2022-01-24 16:03:32
![](https://img.aspxhome.com/file/2023/4/68544_0s.jpg)
My eclipse 端口占用(9360)问题解决办法
2023-05-19 02:34:32
![](https://img.aspxhome.com/file/2023/2/68542_0s.png)
c#接口使用示例分享
2022-02-22 17:38:46
WebView的介绍与简单实现Android和H5互调的方法
2023-04-30 19:26:00
![](https://img.aspxhome.com/file/2023/7/101817_0s.png)
Spring Batch入门教程篇
2022-02-15 01:53:01
![](https://img.aspxhome.com/file/2023/4/83014_0s.png)
android studio3.0以上如何通过navicat访问SQLite数据库文件
2022-03-26 14:28:55
![](https://img.aspxhome.com/file/2023/5/89555_0s.png)
基于swing实现窗体拖拽和拉伸
2023-11-12 22:32:40
![](https://img.aspxhome.com/file/2023/2/69082_0s.gif)
Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法
2023-06-30 02:16:15
JAVA实现扫描线算法(超详细)
2023-06-30 13:33:20
![](https://img.aspxhome.com/file/2023/3/78333_0s.jpg)
基于java的opencv开发过程详解
2022-03-31 20:02:59
![](https://img.aspxhome.com/file/2023/8/82428_0s.png)
Java用户登录验证代码
2022-05-11 16:45:46