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

news2024/11/29 22:48:17
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 list
                                orderby d.age
                                select 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 list
                                orderby d.age descending
                                select 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 list
                                orderby d.age, d.id
                                select 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 list
                                orderby d.age descending, d.id descending
                                select 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 list
                                   orderby d[0], d[1]
                                   select d;
    // 2. 方式二
    query = list.OrderBy(x => x[0]).ThenBy(x => x[1]);
    print_array(query);
}

排序后结果输出为:

在这里插入图片描述

5. 总结

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

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

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

相关文章

美团到店终端从标准化到数字化的演进之路

总第580篇 | 2023年第032篇 本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》。前端团队在产研多角色协同形式上存在不同阶段&#xff0c;而大前端多技术栈在各阶段都有其独特的实践&#xff0c;同时又有类似的演进路线。本文从到店终端团队移动端和前端技术栈持…

最详细GIT学习笔记

1. Git简介 1.1. Git介绍 Git(读音为/gɪt/) 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 1.2. 主流的版本控制器 Git(分布式…

金融帝国实验室(Capitalism Lab)官方正版游戏『2024新年特卖优惠』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2024新年特卖」 ■优惠时限&#xff1a;2024.01.01&#xff5e;01.31 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

【数据结构-单链表】(C语言版本)

今天分享的是数据结构有关单链表的操作和实践&#xff08;图解法&#xff0c;图变化更利于理解&#xff09; 记录宗旨&#x1f4dd;&#xff1a; 眼&#xff08;脑&#xff09;过千遍&#xff0c;不如手过一遍。 我们都知道单链表是一种常见的链表数据结构&#xff0c;由一系列…

【Delphi】IOS上架踩坑记 - 2024年第一天

目录 一、前言&#xff1a; 二、IOS程序上架网址 三、踩坑记 1. 关于版本中的 CFBundleIdentifier 参数&#xff08;Transporter 提示&#xff09; 2. IOS APP 程序图标要求&#xff08;Transporter 提示&#xff09; 3. 关于版本中的 CFBundleShortVersionString 参数&a…

小波理论与应用:理解小波

1 简介 来自源的信号通常处于时域。例如正弦信号、生物医学信号等。任何时域信号都可以使用数学变换进行处理或变换到频域&#xff08;谱域&#xff09;。傅里叶变换是一种流行或著名的变换&#xff0c;它将时域信号转换为频域信号&#xff0c;而不失一般性。 在绘制时域信号…

智能客服系统要素分析:提升客户满意度与工作效率的关键要素

智能客服系统是企业建立完善服务框架的重要工具。市面上存在着形态各异的各种客服系统&#xff0c;如何选择一款最适合自己企业的产品是很多采购人员想知道的问题。事实上&#xff0c;不同的智能客服系统之间的主要功能并未存在太大的区别&#xff0c;它们往往会在一些亮点功能…

m系列mac配置Tomcat

配置上走了些弯路 翻了不少博客各有各的说法&#xff0c;此说明是本人亲自尝试&#xff0c;电脑是m芯片mbp如果不是mac系统&#xff0c;勿跟风尝试 一、下载和安装Tomcat 1.下载 首先&#xff0c;打开Tomcat官网&#xff1a;https://tomcat.apache.org&#xff0c;选择Downlo…

oracle 9i10g编程艺术-读书笔记1

根据书中提供的下载代码链接地址&#xff0c;从github上找到源代码下载地址。 https://github.com/apress下载好代码后&#xff0c;开始一段新的旅行。 设置 SQL*Plus 的 AUTOTRACE 设置 SQL*Plus 的 AUTOTRACE AUTOTRACE 是 SQL*Plus 中一个工具&#xff0c;可以显示所执行…

计算机网络物理层 习题答案及解析

2-1 下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; D &#xff09;。 A. 引脚功能 B. 接口形状 C. 信号电平 D. 传输媒体 【答案】D 【解析】 2-2 某网络在物理层规定&#xff0c;信号的电平范围为- 15V~15V &#xff0c; 电线长…

tp5+workman(GatewayWorker) 安装及使用

一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork&#xff0c;执行安装命令。 composer create-project topthink/think5.0.* tp5 --prefer-dist 2、配置好站点之后&#xff0c;浏览器打开访问成…

VSCode使用Remote SSH远程连接Windows 7

结论 VSCode Server不能启动&#xff0c;无法建立连接。 原因 .vscode-server 目录中的 node.exe 无法运行。 原因是Node.js仅在Windows 8.1、Windows Server 2012 R2或更高版本上受支持。 由于vscode基于node.js v14&#xff0c;不支持Windows 7操作系统。 另&#xff…

为即将到来的量子攻击做好准备的 4 个步骤

当谈到网络和技术领域时&#xff0c;一场风暴正在酝酿——这场风暴有可能摧毁我们数字安全的根本结构。这场风暴被称为 Q-Day&#xff0c;是即将到来的量子计算时代的简写&#xff0c;届时量子计算机的功能将使最复杂的加密算法变得过时。 这场量子革命正以惊人的速度到来&am…

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…

Docker之镜像上传和下载

目录 1.镜像上传 1) 先上百度搜索阿里云 点击以下图片网站 2) 进行登录/注册 3) 使用支付宝...登录 4) 登录后会跳转到首页->点击控制台 5) 点击左上角的三横杠 6) 搜索容器镜像关键词->点击箭头所指 ​ 编辑 7) 进入之后点击实例列表 8) 点击个人实例进入我们的一个…

异步处理方案

目录 1.通过promise的链式调用将异步方法变为同步执行 2.使用async及await 3.回调函数方式 4.三种方式对比 5.async及await使用的注意点 1.通过promise的链式调用将异步方法变为同步执行 function get1(){return new Promise((resolve,reject) >{console.log(执行get1接…

【Java 数组解析:探索数组的奇妙世界】

数组的引入 我们先通过一段简单的代码引入数组的概念。 import java.util.Scanner; public class TestArray01{public static void main(String[] args){//功能&#xff1a;键盘录入十个学生的成绩&#xff0c;求和&#xff0c;求平均数&#xff1a;//定义一个求和的变量&…

ICCV 2023 风格迁移方向 5 篇论文

1、StyleDiffusion: Controllable Disentangled Style Transfer via Diffusion Models 内容和风格&#xff08;Content and style disentanglement&#xff0c;C-S&#xff09;解耦是风格迁移的一个基本问题和关键挑战。基于显式定义&#xff08;例如Gram矩阵&#xff09;或隐式…

[BUG]Datax写入数据到psql报不能序列化特殊字符

1.问题描述 Datax从mongodb写入数据到psql报错如下 org.postgresql.util.PSQLException: ERROR: invalid bytesequence for encoding "UTF8": 0x002.原因分析 此为psql独有的错误&#xff0c;不能对特殊字符’/u0000’,进行序列化&#xff0c;需要将此特殊字符替…

2022年全球运维大会(GOPS上海站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…