C#对集合进行排序
作者:.NET开发菜鸟 发布时间:2022-06-10 02:08:03
标签:C#,集合,排序
先来看看下面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


猜你喜欢
- 在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客
- //C# 根据当前时间获取本周、下周、本月、下月、本季度等时间段DateTime dt = DateTime.Now; //当前
- 前言翻译自:arkadiuszchmura.com/posts/be-ca…最近我在负责一段代码库,需要在使用 Flo
- Json格式是常见的读写形式。读写Json文件也是常用的操作。这次来实践一下Json文件的读写。首先在SD卡上的读写权限是一定要申请的。那么
- 1.pom文件示例2.执行mvn package出现异常mvn package3.异常堆栈详细信息[WARNING] Error injec
- 这篇文章主要介绍了SpringBoot2整合activiti6环境搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对
- 为了实现毛玻璃效果,我们需要一组compute kernels(.rs文件中编写),及一组用于控制renderScript相关的Javaap
- AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dot
- 6.0的手机对于写入手机需要申请权限的我做了如下处理下面我贴出代码package com.example.admin.sdapplicati
- package com.infomorrow.parser_report;import org.junit.Test;public clas
- 01: 异步任务02: 定时任务一、SpringBoot--任务:邮件任务1.1 添加依赖(增加邮件支持)pom.xml <depen
- 本文实例讲述了Android编程实现AIDL(跨进程通信)的方法。分享给大家供大家参考,具体如下:一. 概述:跨进程通信(AIDL),主要实
- C#实现的获取路由器MAC地址,路由器外网地址。对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码。至于获取路由器的
- java应用CPU有波动,事后怎么分析?目前我采用的方案是根据CPU负载自动执行jstack,并将文件上传到OSS。 环境:阿里云
- 本文实例为大家分享了Flutter自定义底部导航栏的具体代码,供大家参考,具体内容如下文件结构:main.dartimport 'p
- 首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetC
- 公司有个业务需要查出所有的用户权限分类,并将最后一层类别所包含的权限查出来。数据库说明,有一个parent_id 字段是最好的:、paren
- 1.使用IDEA新建项目2.选择创建Maven工程3.填写GroupId和ArtifactId4.填写项目名称,与上一步的ArtifactI
- 本文实例为大家分享了Unity Shader实现描边OutLine效果的具体代码,供大家参考,具体内容如下Shader实现描边流程大致为:对