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

news2025/6/2 9:19:59

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;
        }
    }
}

请添加图片描述

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

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

相关文章

【Excel】如何给Excel表格(文档)加密/上锁

目录 0.环境 1.操作步骤 若只输入了【打开权限密码】 若只输入了【修改权限密码】 若同时输入两种密码 0.环境 windows excel2021版 适用情景&#xff1a; 希望给别人提供文档时&#xff0c;需要用密码打开这个文档&#xff0c;加密又分为【打开时加密】和【修改时加密…

【sentinel】Sentinel规则的持久化

Sentinel规则的推送有下面三种模式: 推送模式说明优点缺点原始模式API将规则推送至客户端并直接更新到内存中简单&#xff0c;无任何依赖不保证一致性&#xff1b;规则保存在内存中&#xff0c;重启即消失。严重不建议用于生产环境Pull模式扩展写数据源&#xff08;WritableDa…

【Flutter】MAC环境下打包APK

1、打开终端生成签名文件 keytool -genkey -v -keystore ~/sign.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign 结果 输入**库口令: 再次输入新口令: 您的名字与姓氏是什么?[Unknown]: yuanzhiying 您的组织单位名称是什么?[Unknown]: gongsi 您的组织…

第1章 信息化发展

文章目录 1.1信息与信息化1.1.1信息1.信息的定义2.信息的特征与质量 1.1.2信息系统1.信息系统及其特性2.信息系统生命周期 1.1.3信息化1.信息化内涵&#xff08;4个&#xff1a;体系、产业、环境、积累&#xff09;2.信息化体系&#xff08;国家信息化体系 6 要素&#xff1a;上…

Spark SQL数据源:Hive表

文章目录 一、Spark SQL支持读写Hive二、Spark配置hive-site.xml三、准备工作&#xff08;一&#xff09;启动Hive的metastore&#xff08;二&#xff09;启动Spark Shell 四、Spark读写Hive数据&#xff08;一&#xff09;导入SparkSession&#xff08;二&#xff09;创建Spar…

阿里技术官肝了 3 个月才完成的 20 万字 Java 面试手册

金三银四已经过去&#xff0c;不知道你是已经上岸&#xff0c;还是在等秋招。为了让大家能在面试中如鱼得水&#xff0c;offe 能够手到擒来。小编在此分享一份阿里技术官肝了 3 个月才完成的 20 万字 Java 面试手册。 这份面试手册涉及的技术栈非常全面而且足够细致&#xff0…

在字节跳动和阿里划水4年,过于真实了...

先简单交代一下吧&#xff0c;涛哥是某不知名211的本硕&#xff0c;18年毕业加入阿里&#xff0c;之后跳槽到了头条&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年半的工作经验吧。 这四年半之间他完成了一次晋升&#xff0c;换了一家公司&am…

MySQL数据库用户管理

MySQL数据库用户管理 一、MySQL常用的6大约束二、数据表的高级操作1.克隆表2.清空表&#xff0c;删除表内的所有数据3&#xff0e;创建临时表4&#xff0e;创建外键约束&#xff0c;保证数据的完整性和一致性 三、数据用户管理1.新建用户2&#xff0e;查看用户信息3&#xff0e…

MongoDB 索引操作引起的 Crash

摘要&#xff1a;本文详细阐述了根据引起 Crash 操作进行从配置到源码的分析过程&#xff0c;层层递进&#xff0c;定位复现并给出解决故障方案。 作者&#xff1a;徐耀荣 爱可生南区交付服务部 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理以及相关技术支持。爱好电影&am…

c++学习之多态

目录 1&#xff0c;什么是多态&#xff1f; 2&#xff0c;什么是虚函数&#xff1f; 1.如何实现父类对各个派生子类的操作&#xff1f; 2&#xff0c;父类指针保存子类空间产生的问题。 3&#xff0c;虚函数的定义 4&#xff0c;虚函数的动态绑定机制 5&#xff0c;重载&…

创新方案|时尚品牌企业应用生成式AI的6大机会领域

探讨生成式人工智能&#xff08;Generative AI&#xff09;在时尚产业中的应用&#xff0c;以及它对设计、生产和销售过程的影响。通过使用生成式AI技术&#xff0c;时尚品牌可以更快地设计和生产出更加个性化和符合潮流趋势的产品&#xff0c;同时减少浪费和成本。文章还介绍了…

掌握Python文件操作:从基础到高阶的全方位探索

在本篇博客中&#xff0c;我们将全面、深入地探讨Python中的文件操作。文件操作在Python编程中是不可或缺的一部分&#xff0c;它包含了打开、读取、写入和关闭文件等各种操作。我们将从基础的文件操作讲解到高级的文件处理技巧&#xff0c;以及如何优雅地使用Python进行文件操…

前端vue入门(纯代码)07

【07.TodoList案例】 1 拆分组件 一共拆分为4个组件&#xff1a;【因为header和HTML内置的标签<header>重名&#xff0c;故在之前都加了Todo】 TodoHeaderTodoItem【item是list的子组件】TodoListTodoFooter 2 组件化编码流程 实现静态组件&#xff1a;抽取组件&…

金融行业项目信息化建设方案:人效提升300%

一、行业背景 在大数据、云计算、人工智能等技术的推动下数字化转型正快速改变着金融行业&#xff0c;特别在当下金融与科技深度交互融合的新阶段&#xff0c;“金融科技”正成为金融市场新的趋势。但是在众多传统的金融业务领域&#xff0c;特别是在“投融贷”相关的业务中&a…

深度学习5 -- 循环神经网络(代码实现篇+付详细流程文件)

引言 本文是使用pytorch对循环神经网络RNN(Recurrent Neural Network)的代码实现&#xff0c;作为之前介绍RNN原理的一个代码补充。 RNN原理介绍 本文代码相关介绍相对较为详细&#xff0c;也为自己的一个学习过程&#xff0c;对RNN的理解还是比较浅显&#xff0c;有错误的地…

迪赛智慧数——饼图(环形饼图):哪个年龄段的人最爱存钱?

效果图 50岁到60岁是存钱黄金10年,你存下钱了吗? 据央行发布的2022年金融统计数据报告显示&#xff0c;全年人民币存款额增加26.26万亿元&#xff0c;其中住户存款增加17.84万亿&#xff0c;刷新历史记录。 2022年在全国2200名40岁以下的人中&#xff0c;90后这一职场主力军…

电压放大器在无损检测中的作用和应用有哪些

电压放大器在无损检测中扮演着重要的角色&#xff0c;可以帮助实现信号的放大和增强&#xff0c;从而提高检测的灵敏度和准确性。下面&#xff0c;我们将详细探讨电压放大器在无损检测中的作用和应用。 图&#xff1a;ATA-2000系列高压放大器 电压放大器是一种用于放大电压信号…

Flink SQL之Interval Joins

1.Interval Joins&#xff08;区间Join&#xff09; 区间是双流join的优化&#xff0c;基于处理时间或事件时间&#xff0c;在一定时间区间内数据&#xff0c;相同的key进行join&#xff08;支持 Batch\Streaming&#xff09;。Interval Join 可以让一条流去 Join 另一条流中前…

BFT 最前线|北京智源发布悟道3.0大模型;马克龙会见Meta谷歌人工智能专家;马斯克:特斯拉市值未来将超过苹果与沙特阿美总和

文 | BFT机器人 AI视界 TECHNOLOGY NEWS 01 天垓100完成百亿级参数大模型训练 在第五届智源大会AI系统分论坛上&#xff0c;上海天数智芯半导体有限公司对外宣布&#xff0c;在天垓100加速卡的算力集群&#xff0c;基于北京智源人工智能研究院70亿参数的Aquila语言基础模型&am…

flink + Atlas 任务数据血缘调通

据此修改 Flink 源码 版本Flink1.13.5Atlas1.2.0 将 atlas 配置文件打进 flink-bridge&#xff1b;atlas 相关的 jar 放进 flink/lib jar uf flink-bridge-1.2.0.jar atlas-application.properties flink-conf.yaml 注册监听 org.apache.flink.configuration.ExecutionOpti…