【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序
 前言

 在最近的项目中经常会对C#中的数据进行排序,对于基本数据类型,其排序方式比较简单,只需要调用内置算法即可实现,但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦,所以在本文章中将详细介绍一下在中C#中如何对数据进行排序。

 应用技术:  LINQ;   Array.Sort();

文章目录

  • 1. 使用Sort排序
  • 2. 使用LINQ语句进行排序
  • 3. 多条件排序
  • 4. 多维数据排序
  • 5. 总结

​ 下面我们进行自定义数据进行排序,如下面代码所示,我们在此处定义了一个 Person类,并且继承了IComparable<Person>接口,该接口主要是用于后面调用Sort方法所必需的接口。

class Person : IComparable<Person>
{public string name { get; set; }public int age { get; set; }public int id { get; set; }public int CompareTo(Person? other){if (this.age > other.age) { return 1; }else { return -1; }}public override string ToString(){return "(id: " + id + ", name: " + name + ", age: " + age + ")";}
};

1. 使用Sort排序

  对于自定义数据,我们可以使用Sort方法直接进行排序,默认是采用正序进行排序,此处提供了三种方式:

  • 方式一:使用默认的Sort()方法直接就可以进行排序,但是需要自定义数据继承IComparable<T>接口
  • 方式二:使用Sort()方法并添加回调函数,回调函数调用数据类型CompareTo()方法,该方法可以进行自定义。
  • 方式三:使用Sort()方法并添加回调函数,回调函数进行自定义,此处采用三目运算符写了个简单的方法,该方式无需继承继承IComparable<T>接口以及在自定义数据中添加比较函数。

  代码如下所示:

static void test_person_sort()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一list.Sort();// 2. 方式二list.Sort((x, y) => x.CompareTo(y));// 3. 方式三list.Sort((x, y) => x.age > y.age ? 1 : -1);print_array(list);}

  排序后结果输出为:

在这里插入图片描述

  如果想进行逆序排序,需要修改一下比较规则

static void test_person_sort_()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一list.Sort((x, y) => y.CompareTo(x));// 2. 方式二list.Sort((x, y) => x.age > y.age ? -1 : 1);print_array(list);}

  逆序排序后的输出为

在这里插入图片描述

2. 使用LINQ语句进行排序

  接下来介绍一下使用LINQ语句进行排序,LINQ是一组用于C#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。在此处我们可以使用两种方式实现:

  • 方式一:使用原生的LINQ语句进行查询,此处主要通过自己写LINQ语句;在使用时要注意一点,如果自定义数据继承IComparable<T>接口,那么该数据在比较时会自动调用该数据类的比较方法进行比较,如果未继承该接口,就需要在输入时指定该数据类型使用哪种数据进行比较,如下文代码中,我们使用了d.age属性进行数据比较。
  • 方式二:使用封装好的方法OrderBy(),该方法使用比较简单,可以直接调用对应的方法即可,注意事项跟使用原生的LINQ语句一致。
static void test_person_linq()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一IEnumerable<Person> query = from d in listorderby d.ageselect d;// 2. 方式二query = list.OrderBy(x => x.age);print_array(query);
}

如果想进行逆序排序,只需要添加descending关键字进行设定,或者直接使用OrderByDescending() 方法。

static void test_person_linq_()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一IEnumerable<Person> query = from d in listorderby d.age descendingselect d;// 2. 方式二query = list.OrderByDescending(x => x.age);print_array(query);
}

3. 多条件排序

  在实际使用时,我们可能会遇到多条件排序,即第一个条件相等时时,在采用第二个条件排序,如果遇到这种情况,我们处理起来可能就比较麻烦,对于自定义数据,如果我们在定义数据时继承IComparable<T>接口,并在接口方法中自定义排序要求即可。在下面中我们提供了一种使用Sort()接口并利用委托函数定义比较规则来实现数据排序,代码如下所示:

static void test_person_sort_more()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);list.Sort((x, y) => {if (x.age > y.age) { return 1; }else if (x.age == y.age){if (x.id > y.id) { return 1; }else { return -1; }}else { return -1; }});print_array(list);}

  如果想进行逆序排序,只需要修改一下相关的比较条件即可,逆序排序代码如下所示:

static void test_person_sort_more_()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);list.Sort((x, y) => {if (y.age > x.age) { return 1; }else if (y.age == x.age){if (y.id > x.id) { return 1; }else { return -1; }}else { return -1; }});print_array(list);
}

  通过上面代码我们可以看出使用除了可以使用Sort()接口是比较复杂的,其中的比较过程需要我们自己定义。下面我们将介绍使用LINQ语言进行多条件排序,当我们使用原生的LINQ语句时,在进行自定义数据比较时,需要声明所选择的对象的属性,并且按照先后顺序进行排序即可;如果使用封装后的LINQ语句,可以使用OrderBy()以及ThenBy()分别指定条件,在添加条件时,要生命比较的对象属性。代码如下所示:

static void test_person_linq_more()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一IEnumerable<Person> query = from d in listorderby d.age, d.idselect d;// 2. 方式二query = list.OrderBy(x => x.age).ThenBy(x => x.id);print_array(query);
}

  如果想进行逆序排序,对于原生LINQ语句,在条件后添加descending即可,对于封装后的LINQ语句,

static void test_person_linq_more_()
{List<Person> list = new List<Person>(){new Person(){name="a",age=15,id=1 },new Person(){name="b",age=12,id=2 },new Person(){name="c",age=14,id=3 },new Person(){name="d",age=12,id=4 },new Person(){name="e",age=14,id=5 },new Person(){name="f",age=12,id=6 },new Person(){name="g",age=15,id=7 },};print_array(list);// 1. 方式一IEnumerable<Person> query = from d in listorderby d.age descending, d.id descendingselect d;// 2. 方式二query = list.OrderByDescending(x => x.age).ThenByDescending(x => x.id);print_array(query);
}

  自定义数据排序后,程序运行最后输出为:

在这里插入图片描述

  自定义数据逆序排序后,程序运行最后输出为:
在这里插入图片描述

4. 多维数据排序

  在实际应用中,我们可能还会使用到多维数据,例如对于二维数据,我们在排序时可能会按照第二维数据的第一个数据作为主要排序关键字,第二数据作为第二个关键字进行排序,当遇到这种情况时,我们可以直接使用LINQ语句进行排序,如下面代码所示,我们定义了一个二维数组,类似于将一系列点数据存放到数组中,然后我们可以参考上文中自定义数据排序方法,书写排序代码:

static void test_array_sort()
{List<List<int>> list = new List<List<int>>() {new List<int>{ 1, 9 } ,new List<int>{ 6, 6 } ,new List<int>{ 1, 4 } ,new List<int>{ 6, 2 } ,new List<int>{ 1, 6 } ,new List<int>{ 7, 2 } ,new List<int>{ 1, 2 } ,new List<int>{ 3, 5 }};print_array(list);// 1. 方式一IEnumerable<List<int>> query = from d in listorderby d[0], d[1]select d;// 2. 方式二query = list.OrderBy(x => x[0]).ThenBy(x => x[1]);print_array(query);
}

排序后结果输出为:

在这里插入图片描述

5. 总结

以上就是给大家带来的自定义数据排序方法一些实现方式,希望大家在日常使用中能够用到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区分LR(0),SLR(1),LR(1)和LALR(1)

目录 对于LR(0)文法&#xff1a; 对于SLR(1)文法&#xff1a; 对于LR(0)和SLR(1)文法&#xff1a; 对于LR(1)和SLR(1)文法&#xff1a; 对于LALR(1)文法&#xff1a; 例题1&#xff1a; 例题2&#xff1a; 例题3&#xff1a; 例题4&#xff1a; 这几个文法大致的步骤都…

推荐几个贼有意思的开源项目!

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内感受到开源的魅力&#xff0c;对编程产生兴趣&#xff01; C 项目 1、kilo&#xff1a;不到 1 千行代码实现的迷你文本编辑器。该项…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件&#xff0c;升级AI算法&#xff0c;并支持多人及全身磨皮美化模式&#xff0c;推荐…

【嵌入式开发 Linux 常用命令系列 7.3 -- linux 命令行数值计算】

文章目录 linux 命令行数值计算使用 awk使用 bc 命令使用 Bash 的内置算术扩展使用 expr脚本命令实现 linux 命令行数值计算 在 Linux 命令行中&#xff0c;您可以使用多种方法来执行基本的数学运算。以下是一些示例&#xff1a; 使用 awk awk 是一个强大的文本处理工具&…

【C#】知识点实践序列之Lock的输出多线程信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2023年第2篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇在Lock锁定代码…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

web component - 使用HTML Templates和Shadow DOM构建现代UI组件

Web Component是一种用于构建可重用的UI组件的技术。它使用标准化的浏览器API&#xff0c;包括Custom Elements、Shadow DOM和HTML Templates来实现组件化开发方式。这些API都是现代浏览器原生支持的&#xff0c;因此不需要引入第三方库或框架即可使用。 在这篇博客中&#xf…

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

SpringCloud-高级篇(九)

&#xff08;1&#xff09;Seata高可用 我们学习了Seata的各种用法了&#xff0c;Seata的服务是单节点部署的&#xff0c;这个服务如果挂了&#xff0c;整个事务都没有办法完了&#xff0c;下面我们学习Seata的高可用的知识。 实现高可用&#xff0c;还是比较简单&#xff0c;…

QT上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 用抽奖软件抽奖&#xff0c;是一种很常见的抽奖方式。特别是写这篇文章的时候&#xff0c;正好处于2023年12月31日&#xff0c;也是一年中最后一天…

【华为机试】2023年真题B卷(python)-喊七的次数重排

一、题目 题目描述&#xff1a; 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;…

新手快速上手掌握基础排序<二>快速排序快速入门

目录 引言 一&#xff1a;快速排序qsort的简介 1.qsort是一个库函数 2.库函数的查询了解方法 3.qsort的具体使用方法 4.qsort函数使用的一些注意点 5.qsort函数的特点 6.代码实现 (1)整数数组的快速排序 &#xff08;2&#xff09;结构体的快速排序&#xff08;学…

使用.Net nanoFramework 驱动ESP32的OLED显示屏

本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始&#xff0c;逐步深入&#xff0c;让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者&#xff0c;这篇文章都会对你有所帮助。 1. 硬件准备 1.1 ESP32开发板 这里我们…

PyTorch的Tensor(张量)

一、Tensor概念 什么是张量&#xff1f; 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展 Tensor与Variable Variable是torch.autograd中的数据类型&#xff0c;主要用于封装Tensor&#xff0c;进行自动求导。 data: 被包装的Tensorgrad: data的梯度&…

基于OpenCv的车道检测

项目背景和步骤 车道检测是自动驾驶领域不可或缺的一环 具体步骤如下&#xff1a; 一、将图像灰度化&#xff0c;并进行适度的高斯滤波&#xff0c;剔除干扰 二、利用Canny边缘检测&#xff0c;检测出车道和其它物体的边缘 三、使用ROI区域截取&#xff0c;截取需要的部分&a…

AI与数字化映像:颜值开端,功能至上_光点科技

在人工智能的浪潮中&#xff0c;AI数字人的兴起正成为一个不可忽视的现象。随着ChatGPT等生成式AI算法的进步&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;的应用呈现出爆发性增长&#xff0c;不仅在技术圈引起广泛关注&#xff0c;也为元宇宙及其相关产业链带来了…

小白入门java基础-反射详解

一&#xff1a;介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序&#xff0c;在一次编译后&#xff0c;可以在多个系统平台上运行。 主…

Spring Boot笔记1

1. SpringBoot简介 1.1. 原有Spring优缺点分析 1.1.1. Spring的优点分析 Spring是Java企业版&#xff08;Java Enterprise Edition&#xff0c;javeEE&#xff09;的轻量级代替品。无需开发重量级的Enterprise JavaBean&#xff08;EJB&#xff09;&#xff0c;Spring为企业…

Bmp2Png是什么工具?好用吗?

Bmp2Png是什么工具&#xff1f;好用吗&#xff1f; 批量BMP图片转为PNG透明图片&#xff0c;去掉BMP黑色背景&#xff0c;压缩导出png图片V1.1前段时间上传了一款bmp转png并去黑底的demo软件&#xff0c;非常受欢迎&#xff0c; 上一版本地址&#xff1a;批量BMP图片转为PNG…

计算机网络 (期末救命版)

文章目录 Ⅰ 网络概述1. 互联网概述与组成2. 计算机网络的类别3. 计算机网络的性能指标4. 计算机网络体系结构 Ⅱ 物理层1. 物理层的任务2. 信道复用技术 Ⅲ 数据链路层1. 点对点信道2. 基本问题3. 点对点协议 PPP4. 使用广播信道的数据链路层 Ⅳ 网络层1. 网络层的服务2. 网际…