C#中List<T>的排序相关的使用方法总结

C#中List<>的排序相关的使用方法

list的排序一般使用Sort和LINQ的Orderby方法,本文主要介绍其如何使用。

🌮1.Sort和实现Comparable接口

此方式需要类去实现IComparable接口

public  class OrderTest
{


    [Test]
    public void OraderTest()
    {
        List<ExpOne> list = new List<ExpOne>()
        {
            new ExpOne(){ NumOne = 3.12M, NumTwo = 5.54M, NumThree = 4.22M},
            new ExpOne(){ NumOne = 6.76M, NumTwo = 3.54M, NumThree = 7.67M},
            new ExpOne(){NumOne = 1.23M, NumTwo = 7.32M, NumThree = 2.85M},
            new ExpOne(){NumOne  = 2.44M, NumTwo = 1.66M,NumThree = 6.11M}
        };

        list.Sort();

        list.ForEach(item => { Console.WriteLine("值1为:"+item.NumOne+" 值2为:"+item.NumTwo +" 值3为:"+item.NumThree); });
    }

    /// <summary>
    /// 用例类1
    /// </summary>
    public  class ExpOne:IComparable
    {
        /// <summary>
        /// 值一
        /// </summary>
        public decimal NumOne { get; set; }

        /// <summary>
        /// 值二
        /// </summary>
        public decimal NumTwo { get; set; }

        /// <summary>
        /// 值三
        /// </summary>
        public decimal NumThree { get; set; }

        /// <summary>
        /// 文本内容
        /// </summary>
        public string context { get; set; }

        //重写比较方法
        public int CompareTo(object obj)
        {
            ExpOne item = (ExpOne)obj;
			//这里以属性NumTwo进行排序,返回正值为this对象大于OBJ
            //返回负值为this对象小于OBJ
            if (this.NumTwo >= item.NumTwo)
                return 1;
            else
                return -1;

        }
    }
}

在这里插入图片描述

PS:Sort默认按Comparable的正值排序(也就是从小到大

另外也可以不实现Comparable接口而传入一个匿名实现

[Test]
    public void OraderTest()
    {
        List<ExpOne> list = new List<ExpOne>()
        {
            new ExpOne(){ NumOne = 3.12M, NumTwo = 5.54M, NumThree = 4.22M},
            new ExpOne(){ NumOne = 6.76M, NumTwo = 3.54M, NumThree = 7.67M},
            new ExpOne(){NumOne = 1.23M, NumTwo = 7.32M, NumThree = 2.85M},
            new ExpOne(){NumOne  = 2.44M, NumTwo = 1.66M,NumThree = 6.11M}
        };

        list.Sort((left,right)=>{
            if (left.NumTwo >= right.NumTwo)
                return 1;
            else
                return -1;
        });

        list.ForEach(item => { Console.WriteLine("值1为:"+item.NumOne+" 值2为:"+item.NumTwo +" 值3为:"+item.NumThree); });
    }

    /// <summary>
    /// 用例类1
    /// </summary>
    public  class ExpOne
    {
        /// <summary>
        /// 值一
        /// </summary>
        public decimal NumOne { get; set; }

        /// <summary>
        /// 值二
        /// </summary>
        public decimal NumTwo { get; set; }

        /// <summary>
        /// 值三
        /// </summary>
        public decimal NumThree { get; set; }

        /// <summary>
        /// 文本内容
        /// </summary>
        public string context { get; set; }


    }
}

效果也是一样的:

在这里插入图片描述

ps:Sort方法可以只对list一部分进行排序

🏀🐔2.使用LINQ进行排序

LINQ排序只需要使用OrderBy即可,功能也更加强大,同时也有几个需要注意的点。

🎤一.基础使用
public void OraderTest()
{
List<ExpOne> list = new List<ExpOne>()
{
    new ExpOne(){ NumOne = 3.12M, NumTwo = 5.54M, NumThree = 4.22M, context = "2023/06/14 09:08:02"},
    new ExpOne(){ NumOne = 6.76M, NumTwo = 3.54M, NumThree = 7.67M, context = "2023/06/14 08:46:02"},
    new ExpOne(){NumOne = 1.23M, NumTwo = 7.32M, NumThree = 2.85M,  context = "2023/06/14 10:02:45"},
    new ExpOne(){NumOne  = 2.44M, NumTwo = 1.66M,NumThree = 6.11M, context = "2023/06/14 08:39:34"}
};

list = list.OrderBy(it=>it.NumTwo).ToList();                         //根据属性值排序
list = list.OrderBy(it => Convert.ToDateTime(it.context)).ToList();  //更具转化的属性值排序
list = list.OrderBy(it => it.NumOne).ThenBy(it => it.NumTwo).ToList();                        //多个条件组合排序

list = list.OrderByDescending(it => it.NumTwo).ToList();
list = list.OrderByDescending(it => Convert.ToDateTime(it.context)).ToList();
list = list.OrderByDescending(it => it.NumOne).ThenBy(it => it.NumTwo).ToList();

list.ForEach(item => { Console.WriteLine("值1为:"+item.NumOne+" 值2为:"+item.NumTwo +" 值3为:"+item.NumThree); });
}

PS:

注意一定要排序后赋值给原list,不然对原list没有效果。

注意一定要排序后赋值给原list,不然对原list没有效果。

注意一定要排序后赋值给原list,不然对原list没有效果。

🏃二.进阶使用

指定排序顺序到特定值。

有时候我们希望某个值为特定值时,将其放到特殊的位置(毕竟特殊值不像可用于排序的基础数据类型,可以直接用于排序,像是0,1,2,3…)

[Test]
public void OraderTest()
{
    List<ExpOne> list = new List<ExpOne>()
    {
        new ExpOne(){ NumOne = 3.12M, NumTwo = 5.54M, NumThree = 4.22M, context = "艺演丁真"},
        new ExpOne(){ NumOne = 6.76M, NumTwo = 3.54M, NumThree = 7.67M, context = "轶研丁真"},
        new ExpOne(){NumOne = 1.23M, NumTwo = 7.32M, NumThree = 2.85M,  context = "尼古丁真"},
        new ExpOne(){NumOne  = 2.44M, NumTwo = 1.66M,NumThree = 6.11M, context = "芙蓉王源"}
    };
	//这里为自定义的顺序,
    List<string> MySortlist = new List<string>() { "尼古丁真","芙蓉王源","艺演丁真","轶研丁真" };

    list = list.OrderBy(it => MySortlist.IndexOf(it.context)).ToList();

    list.ForEach(item => { Console.WriteLine("值1为:"+item.NumOne+" 值2为:"+item.NumTwo +" 值3为:"+item.NumThree + " 名字是:"+item.context); });
}

/// <summary>
/// 用例类1
/// </summary>
public  class ExpOne
{
    /// <summary>
    /// 值一
    /// </summary>
    public decimal NumOne { get; set; }

    /// <summary>
    /// 值二
    /// </summary>
    public decimal NumTwo { get; set; }

    /// <summary>
    /// 值三
    /// </summary>
    public decimal NumThree { get; set; }

    /// <summary>
    /// 文本内容
    /// </summary>
    public string context { get; set; }


	}
}

在这里插入图片描述

PS:这个顺序集合可以是从别的数据库中读取,或是别的对象中获取。重点是;你可以完全控制每个元素的位置,自定义排序规则

复杂对象的自定义排序

有些集合的Model可能有别的引用类属性,如果需要按照其进行排序可能需要自定义其规则。(需要根据具体业务来确定)

例:

public  class OrderTest
{


    [Test]
    public void OraderTest()
    {
        List<ExpOne> list = new List<ExpOne>()
        {
            new ExpOne(){ NumOne = 3.12M, NumTwo = 5.54M, NumThree = 4.22M, context = "艺演丁真", info = new InnerOne(){ Peopel_Age = 33 } },
            new ExpOne(){ NumOne = 6.76M, NumTwo = 3.54M, NumThree = 7.67M, context = "轶研丁真", info = new InnerOne(){ Peopel_Age = 24 }} ,
            new ExpOne(){NumOne = 1.23M, NumTwo = 7.32M, NumThree = 2.85M,  context = "尼古丁真", info = new InnerOne(){ Peopel_Age = 28  }},
            new ExpOne(){NumOne  = 2.44M, NumTwo = 1.66M,NumThree = 6.11M, context = "芙蓉王源",  info = new InnerOne(){ Peopel_Age = 19  }}
        };



        list = list.OrderBy(it => it.info,new CustomerComparer()).ToList();


        list.ForEach(item => { Console.WriteLine("值1为:"+item.NumOne+" 值2为:"+item.NumTwo +" 值3为:"+item.NumThree + " 名字是:"+item.context +" 年龄为:"+item.info.Peopel_Age); });
    }

    /// <summary>
    /// 用例类1
    /// </summary>
    public  class ExpOne
    {
        /// <summary>
        /// 值一
        /// </summary>
        public decimal NumOne { get; set; }

        /// <summary>
        /// 值二
        /// </summary>
        public decimal NumTwo { get; set; }

        /// <summary>
        /// 值三
        /// </summary>
        public decimal NumThree { get; set; }

        /// <summary>
        /// 文本内容
        /// </summary>
        public string context { get; set; }


        public InnerOne info { get; set; }
    }

    public class InnerOne
    {
        public int Peopel_Age { get; set; }

    }

    /// <summary>
    /// 
    /// </summary>
    public class CustomerComparer : Comparer<InnerOne>
    {

        public override int Compare([AllowNull] InnerOne x, [AllowNull] InnerOne y)
        {
            if (x.Peopel_Age >= y.Peopel_Age)
                return 1;
            else
                return -1;
        }
    }
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL优化--undo log和redo log的区别

首先我们需要知道两个概念 缓冲池&#xff08;buffer pool&#xff09;:主内存中的一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删改查操作时&#xff0c;先操作缓冲池中的数据&#xff08;若缓冲池没有数据&#xff0c;则从磁盘加载并缓存…

(写自己语言的练手级应用)JSON(JavaScript Object Notation) 产生式(BNF)

写自己的开发语言时&#xff0c;很多人都会拿JSON当第一个练习对象 开源net json FJSON 解析工具https://dbrwe.blog.csdn.net/article/details/107611540?spm1001.2014.3001.5502 <json> :: <object> | <array> <object> :: "{" [ <me…

操作系统 复习-计算题

一. 计算题&#xff08;共5题&#xff0c;100分&#xff09; 1.(计算题) 假设有4个进程需要在单CPU上运行&#xff0c;它们的执行时间如下表所示&#xff1a; 进程ID执行时间P18P25P32P44 现在我们需要按照抢占式优先级调度算法来安排这些进程的执行顺序。其中&#xff0c;进…

python代码加密方案

为何要对代码加密&#xff1f; python的解释特性是将py编译为独有的二进制编码pyc 文件&#xff0c;然后对pyc中的指令进行解释执行&#xff0c;但是pyc的反编译却非常简单&#xff0c;可直接反编译为源码&#xff0c;当需要将产品发布到外部环境的时候&#xff0c;源码的保护尤…

基于机器学习的内容推荐算法及其心理学、社会学影响闲谈

基于机器学习的内容推荐算法目前在各类内容类APP中使用的非常普遍。在购物、时尚、新闻咨询、学习等领域&#xff0c;根据用户的喜好&#xff0c;进行较为精准的用户画像与内容推荐。此类算法不但可以较为准确的分析用户的特征&#xff0c;如年龄、性别等&#xff0c;还能通过长…

特征点Features2D类介绍

文章目录 Features2D类介绍1. cv::AgastFeatureDetector2. cv::AKAZE3. cv::BRISK4. cv::FastFeatureDetector5. cv::GFTTDetector6. cv::KAZE7. cv::MSER8. cv::SimpleBlobDetector9. cv::StarDetector10. cv::SIFT11. cv::SURF12. cv::FastFeatureDetector13. cv::AgastFeatu…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

【c语言】 -- 详解数组篇

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习数据的存储。 让我们开启c语言学…

考虑微网新能源经济消纳的共享储能优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C#异步详解

异步编程是指在程序执行过程中&#xff0c;不需要等待某个操作完成&#xff0c;就可以继续执行后续的代码。比如我们开发了一个web页面中有一个上传文件功能&#xff0c;我们上传文件时使用异步操作&#xff0c;就不用等待文件的上传时间&#xff0c;可以先在网页上进行其他操作…

JAVA_HOME变量的详细配置(图文)

用到Java项目的时候&#xff0c;有时候要用到Java_home&#xff0c;这个需要在系统配置中配置一下。如何操作呢&#xff1f;以下为详细的图文步骤。 1&#xff09;打开环境变量的窗口 2&#xff09;打开新建系统变量 3&#xff09;编辑JAVA_HOME 在变量名后输入JAVA_HOME,找到…

Ui自动化测试如何上传文件

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

centos直接部署express

centos直接部署express 以下是在CentOS上部署Express应用程序的一般步骤&#xff1a; 1.安装Node.js 在CentOS系统上安装Node.js。可以使用以下命令安装Node.js&#xff1a; sudo yum install nodejs2.安装npm 安装完Node.js后&#xff0c;还需要安装npm&#xff08;Node.…

Python爬虫被封ip解决方案

在使用 Python 程序进行网络爬虫开发时&#xff0c;可能因以下原因导致被封 IP 或封禁爬虫程序&#xff1a; 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次&#xff0c;从而对目标网站造成较大的负担和压力&#xff0c;这种行为容易引起目标网站的注意并被封禁…

数据结构-队列

数据结构之队列 队列的概念顺序队列循环队列 顺序循环队列的ADT定义1、简单结构体定义2、初始化3、队列的清空4、计算队列的长度5、判断队列是否为空6、插入新的元素7、元素的删除8、遍历输出队列内的所有元素 链队列的ADT定义1、链队列简单结构体定义2、初始化链队列3、判断链…

神秘的临时对象

下面的程序输出什么&#xff1f;为什么&#xff1f; 程序意图&#xff1a; 在 Test() 中以 0 作为参数调用 Test(int i) 将成员变量 mi 的初始值设置为 0 运行结果&#xff1a; 成员变量 mi 的值为随机值 构造函数是一个特殊的函数 是否可以直接调用&#xff1f; 是否可以…

LVS+KeepAlived高可用负载均衡集群

LVSKeepAlived高可用负载均衡集群 1. 高可用群集的相关知识1.普通群集2.高可用群集(HA)3.Keepalived及其工作原理4.Keepalived体系主要模块及其作用5.健康检查方式&#xff08;学名&#xff1a;探针&#xff09; 二、脑裂的形成和解决1.产生脑裂的常见原因及解决方法2.脑裂预防…

谈找工作线上途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉勾网 猎聘网站智联招聘网站后记 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait…

新能源汽车保养vr仿真教学软件为职业培训带来新的思路和方法

电动车电池更换VR虚拟体验是一种利用VR虚拟现实技术实现对电动车电池更换进行模拟仿真演示和实操训练的虚拟仿真实验教学课件&#xff0c;相比传统教学模式&#xff0c;有效提高学生的实践能力和技能水平。 通过VR技术模拟现场&#xff0c;使培训人员可以身临其境滴观摩操作过程…

在 PyTorch 中实现可解释的神经网络模型

动动发财的小手&#xff0c;点个赞吧&#xff01; 目的 深度学习系统缺乏可解释性对建立人类信任构成了重大挑战。这些模型的复杂性使人类几乎不可能理解其决策背后的根本原因。 ❝ 深度学习系统缺乏可解释性阻碍了人类的信任。 ❞ 为了解决这个问题&#xff0c;研究人员一直在…