首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于反射、泛型的不定参数、不定类型的排序

基于反射、泛型的不定参数、不定类型的排序

作者头像
祝你万事顺利
发布于 2019-06-13 11:06:58
发布于 2019-06-13 11:06:58
2.1K00
代码可运行
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发
运行总次数:0
代码可运行

方法相关 参数: string数组 - 全部要比较的字段名称 bool数组 - 每一个字段升序排序还是降序排序 IList<T>集合 - 要排序的List

内部实现; 通过反射找到全部string数组中的字段,从第一个字段开始比较,如果相等,比较第二个字段,直到最后一个,通过bool控制升序还是降序。

使用方法 如Main函数中的使用,传入参数,调用IListSort类中的Sort方法,得到的传入的list就会进行排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> personList = new List<Person>
            {
                new Person("kk",101,150,true),
                new Person("kklady",100,10,true),
                new Person("kkwomen",100,2,true),
                new Person("kkwomen",100,777,true),
                new Person("kkwomen",712,150,true),
                new Person("kkwomen",99,666,true),
            };
            string[] field = { "age", "height" };
            bool[] boolArray = { true, false };
            IListSort<Person> listSort = new IListSort<Person>(field, boolArray, personList);
            listSort.Sort();
            Console.WriteLine(personList);
        }
    }

    public class IListSort<T>
    {
        private string[] propertName;
        private bool[] sortBy;
        private IList<T> iList;

        public IListSort(string[] propertName, bool[] sortBy, IList<T> iList)
        {
            this.propertName = propertName;
            this.sortBy = sortBy;
            this.iList = iList;
        }

        public void Sort()
        {
            if (iList.Count <= 1)
            {
                return;
            }
            for (int i = 1; i < iList.Count; i++)
            {
                T t = iList[i];
                int j = i;//避免闭包
                while ((j > 0) && Compare(iList[j - 1], t) < 0)
                {
                    iList[j] = iList[j - 1];
                    --j;
                }
                iList[j] = t;
            }
            return;
        }

        /// <summary>
        /// 比较大小,前者小于后者返回1,相等返回0,前者大于后者返回-1
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t1"></param>
        /// <param name="t2"></param>
        /// <returns></returns>
        public int Compare(T t1, T t2)
        {
            for (int i = 0; i < propertName.Length; i++)
            {
                if (string.IsNullOrEmpty(propertName[i]))
                {
                    throw new ArgumentNullException("空排序属性异常");
                }
            }
            FieldInfo[] fieldInfos = new FieldInfo[propertName.Length];
            var type = typeof(T);
            for (int i = 0; i < propertName.Length; i++)
            {
                FieldInfo fieldInfo = type.GetField(propertName[i]);
                if (fieldInfo == null)
                {
                    throw new ArgumentNullException(propertName[i] + "字段不存在");
                }
                fieldInfos[i] = fieldInfo;
            }
            int compare = 0;
            for (int i = 0; i < propertName.Length; i++)
            {
                //compare等于一个排序方法
                compare = CompareInField(t1, t2, fieldInfos[i], sortBy[i]);
                if(compare != 0)//控制
                {
                    return compare;
                }
            }
            return compare;
        }

        private int CompareInField(T t1, T t2, FieldInfo fieldInfo, bool sortBy)
        {
            switch (fieldInfo.FieldType.ToString())
            {
                case "System.Int32"://这里是等于FieldType的全名
                    int int1 = 0;
                    int int2 = 0;
                    if (fieldInfo.GetValue(t1) != null)
                    {
                        int1 = Convert.ToInt32(fieldInfo.GetValue(t1));
                    }
                    if (fieldInfo.GetValue(t2) != null)
                    {
                        int2 = Convert.ToInt32(fieldInfo.GetValue(t2));
                    }
                    if (sortBy)
                    {
                        return int2.CompareTo(int1);//升序
                    }
                    else
                    {
                        return int1.CompareTo(int2);//降序
                    }
                case "System.Double":
                    double double1 = 0;
                    double double2 = 0;
                    if (fieldInfo.GetValue(t1) != null)
                    {
                        double1 = Convert.ToDouble(fieldInfo.GetValue(t1));
                    }
                    if (fieldInfo.GetValue(t2) != null)
                    {
                        double2 = Convert.ToDouble(fieldInfo.GetValue(t2));
                    }
                    if (sortBy)
                    {
                        return double2.CompareTo(double1);
                    }
                    else
                    {
                        return double1.CompareTo(double2);
                    }
                case "string":
                default:
                    break;
            }
            return 0;
        }
    }

    public class Person
    {
        public string name;
        public int age;
        public double height;
        public bool sex;

        public Person(string name, int age, double height, bool sex)
        {
            this.name = name;
            this.age = age;
            this.height = height;
            this.sex = sex;
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# List<T>进行多字段排序
//调用方法 IList<class> List = new List<class>(); //排序字段 string[] property = new string[] { "column1","column2" }; //对应排序字段的排序方式 bool[] sort =new bool[]{ false,false }; //对 List 排序 List = new IListSort<class>(List, property,sort).Sort(); using System; using Sy
用户7705674
2021/11/03
1.3K0
Java之自定义排序工具类
在项目开发中,经常会遇到需要对一个复杂对象的集合进行规则排序,可能需要根据某一字段排序,也可能需要根据某些字段排序,导致冗余的代码看起来既复杂又繁琐。因此,我们可以通过封装一个通用的工具类,来针对所有的复杂对象进行抽象处理。 这样会使你的代码显得更加具备通用性,并且可适配。
23号杂货铺
2019/09/27
1.8K0
Java之自定义排序工具类
Java官方笔记8泛型
为什么需要泛型?generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods.
dongfanger
2023/07/10
2710
Java官方笔记8泛型
C# 学习笔记(9)—— 泛型
C# 2.0 提出的泛型特性使类型可以被参数化,从而不必再为不同的而类型提供特殊版本的方法实现。泛型提供了代码重用的另一种机制,它不同于面向对象中通过继承方式实现代码重用,更准确地说,泛型锁提供的代码重用是算法的重用,即某个方法实现不需要考虑所操作数据的类型
Karl Du
2023/10/20
2670
Java8中的Stream API详解
在传统的J2EE应用中,Java代码经常不得不依赖于关系型数据库的聚合操作来完成诸如:
用户4396583
2024/08/03
2200
Java 8 中的 Streams API 详解
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
编程十年
2019/09/17
1.2K0
深入分析委托与事件—C#综合揭秘——细说多线程
本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单。 还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单。 在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用。 最后一节,将介绍Predicate<T>、Action<T>、Func<T,TResult>多种泛型委托的使用和Lambda的发展过程与其使用方式。 因为时间仓促,文中有错误的地方敬请点评。
vv彭
2021/01/06
2.3K0
自定义多列排序:C++/Java实现
  有些时候,我们在编程中会遇到多列排序的需求。假如在execle,这事儿就太easy了。不过没办法,现在就需要你用Java或者C++实现这样一个功能!
云海谷天
2022/08/09
6750
自定义多列排序:C++/Java实现
十:Java之泛型
在程序编码中一些包括类型參数的类型,也就是说泛型的參数仅仅能够代表类。不能代表个别对象。(这是当今较常见的定义)
全栈程序员站长
2022/07/08
2710
Jdk8 之 Stream流详细用法(一)
本篇文章参考云深i不知处的文章 原文链接:https://blog.csdn.net/mu_wind/article/details/109516995
木字楠
2022/11/15
4470
Jdk8 之 Stream流详细用法(一)
MatchTitle 主程序入口
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105944.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
8850
java泛型详解
泛型,即"参数化类型"。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
码农王同学
2020/04/08
1.4K0
JAVA——JDK 8新特性学习与整理
在自己工作、开发、学习中,特别是在阅读别人的项目源码时,总是能看到使用Lambda表达式和Stream流的代码写法,这两个新特性是JDK 8主要的特性和自己的编程风格。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,现如今已经JDK14都出来了,所以了解,阅读,和使用JDK 8新特性是非常有必要的,在面试的过程中也会经常被问到。
不愿意做鱼的小鲸鱼
2022/09/26
6080
JAVA——JDK 8新特性学习与整理
Java集合分类以及各自特点
常用的就是ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet,HashMap,LinkedHashMap,TreeMap; 数组和集合的区别 区别1: 数组可以存储基本数据类型/引用数据类型 基本数据类型存的是值 引用数据类型存的是地址 数组在创建的时候 就会定义存储的数据类型 也就是只能存储一种数据类型 集合只能存储引用数据类型(对象) 集合中也可以存储基本数据类型(装箱)最终存储的还是 Object 如果没有泛型限定 默认存储的都是 Object类型的数据 也就是任意类型 区别2 数组长度是固定的,不能自动增长 集合是长度可变的,根据元素的多少来决定长度
全栈程序员站长
2022/09/01
5670
JAVA Stream小结
Stream API可以极大提高Java程序员的生产力, 让程序员写出高效率、干净、简洁的代码.
一个架构师
2022/06/20
5290
JAVA Stream小结
Java-Java5.0泛型解读
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
小小工匠
2021/08/17
5740
Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。
云深i不知处
2020/11/12
3.7K0
Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
C#中的委托delegate
委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。你可以通过委托调用方法。委托用于将方法参数传递给其它方法。事件处理程序就是通过委托调用的方法(这是MSDN中对委托的解释)。个人感觉C#中委托类似于C++中的函数指针,但委托又是一种特殊的类,只有方法的类。
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.1K0
C#中的委托delegate
Java 基础 -- 泛型、集合、IO、反射
计划把 Java 基础的有些部分再次看一遍,巩固一下,下面以及以后就会分享自己再次学习的一点笔记!不是有关标题的所有知识点,只是自己觉得模糊的一些知识点。 1.  对于泛型类而言,你若没有指明其类型,默认为Object; 2.  在继承泛型类以及接口的时候可以指明泛型的类型,也可以不指明; 3.   泛型也数据库中的应用:       写一个 DAO 类对数据库中的数据进行增删改查其类型声明为 <T> 。每张表对应一个类,对应每一张表实现一个类继承该 DAO 类并指明 DAO 泛型为该数据表对应的类,再实现
bgZyy
2018/05/16
9780
Unity网络交互☀️Unity Web弱联网的实现
该脚本为PHP脚本,用于将从Unity获得的数据传到数据库存储起来。默认已经设置好PHP运行环境
星河造梦坊官方
2024/08/15
2890
Unity网络交互☀️Unity Web弱联网的实现
相关推荐
C# List<T>进行多字段排序
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入北京开发者交友群
结识首都开发者 拓展技术人脉
加入前端工作实战群
前端工程化实践 组件库开发经验分享
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档