Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# List<T>进行多字段排序

C# List<T>进行多字段排序

原创
作者头像
用户7705674
修改于 2021-11-03 01:47:22
修改于 2021-11-03 01:47:22
1.2K00
代码可运行
举报
文章被收录于专栏:css小迷妹css小迷妹
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//调用方法
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 System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Common
{
    /// <summary>
    /// IList排序类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class IListSort<T>
    {
        private string[] _propertyName;
        private bool[] _sortBy;
        private IList<T> _list;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="list">排序的Ilist</param>
    /// <param name="propertyName">排序字段属性名</param>
    /// <param name="sortBy">true升序 false 降序 不指定则为true</param>
    public IListSort(IList<T> list, string[] propertyName, bool[] sortBy)
    {
        _list = list;
        _propertyName = propertyName;
        _sortBy = sortBy;
    }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="list">排序的Ilist</param>
    /// <param name="propertyName">排序字段属性名</param>
    /// <param name="sortBy">true升序 false 降序 不指定则为true</param>
    public IListSort(IList<T> list, string[] propertyName)
    {
        _list = list;
        _propertyName = propertyName;
        for (int i = 0; i < _propertyName.Length; i++)
        {
            _sortBy[i] = true;
        }
    }

    /// <summary>
    /// IList
    /// </summary>
    public IList<T> List
    {
        get { return _list; }
        set { _list = value; }
    }

    /// <summary>
    /// 排序字段属性名
    /// </summary>
    public string[] PropertyName
    {
        get { return _propertyName; }
        set { _propertyName = value; }
    }

    /// <summary>
    /// true升序 false 降序
    /// </summary>
    public bool[] SortBy
    {
        get { return _sortBy; }
        set { _sortBy = value; }
    }

    /// <summary>
    /// 排序,插入排序方法
    /// </summary>
    /// <returns></returns>
    public IList<T> Sort()
    {
        if (_list.Count == 0) return _list;
        for (int i = 1; i < _list.Count; i++)
        {
            T t = _list[i];
            int j = i;
            while ((j > 0) && Compare(_list[j - 1], t) < 0)
            {
                _list[j] = _list[j - 1];
                --j;
            }
            _list[j] = t;
        }
        return _list;
    }

    /// <summary>
    /// 比较大小 返回值 小于零则X小于Y,等于零则X等于Y,大于零则X大于Y
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    private int Compare(T x, T y)
    {
        int i =0;
        //检查属性名
        for (i = 0; i < _propertyName.Length; ++i)
        {
            if (string.IsNullOrEmpty(_propertyName[i])) throw new ArgumentNullException("没有指字对象的排序字段属性名!");
        }

        //取属性的属性
        PropertyInfo[] property = new PropertyInfo[_propertyName.Length];
        for (i = 0; i < _propertyName.Length; ++i)
        {
            property[i] = typeof(T).GetProperty(_propertyName[i]);
            if (property[i] == null) throw new ArgumentNullException("在对象中没有找到指定属性!");
        }

        int compare = 0;
        for (i = 0; i < _propertyName.Length;++i)
        {
            compare = CompareOne(x, y, property[i], _sortBy[i]);
            if (compare != 0) return compare;
        }
        return compare;
    }

    private int CompareOne(T x,T y,PropertyInfo property,bool sortBy)
    {
        switch (property.PropertyType.ToString())
        {
            case "System.Int32":
                int int1 = 0;
                int int2 = 0;
                if (property.GetValue(x, null) != null)
                {
                    int1 = Convert.ToInt32(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    int2 = Convert.ToInt32(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return int2.CompareTo(int1);
                }
                else
                {
                    return int1.CompareTo(int2);
                }
                break;
            case "System.Double":
                double double1 = 0;
                double double2 = 0;
                if (property.GetValue(x, null) != null)
                {
                    double1 = Convert.ToDouble(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    double2 = Convert.ToDouble(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return double2.CompareTo(double1);
                }
                else
                {
                    return double1.CompareTo(double2);
                }
                break;
            case "System.String":
                string string1 = string.Empty;
                string string2 = string.Empty;
                if (property.GetValue(x, null) != null)
                {
                    string1 = property.GetValue(x, null).ToString();
                }
                if (property.GetValue(y, null) != null)
                {
                    string2 = property.GetValue(y, null).ToString();
                }
                if (sortBy)
                {
                    return string2.CompareTo(string1);
                }
                else
                {
                    return string1.CompareTo(string2);
                }
                break;
            case "System.DateTime":
                DateTime DateTime1 = DateTime.Now;
                DateTime DateTime2 = DateTime.Now;
                if (property.GetValue(x, null) != null)
                {
                    DateTime1 = Convert.ToDateTime(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    DateTime2 = Convert.ToDateTime(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return DateTime2.CompareTo(DateTime1);
                }
                else
                {
                    return DateTime1.CompareTo(DateTime2);
                }
                break;
        }
        return 0;
    }
}
 
}</pre> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
趣解设计模式之《小王设计的疫苗管理平台系统》
小王所在公司又接到了一个大单子,就是需要他们开发一个用于给百姓们申请打疫苗的疫苗管理平台系统,在系统中需要填报自己的个人信息用于疫苗检测数据采集。采集表里包含:姓名、居住地址、要去哪个疫苗检测医院网点、注射什么品牌的疫苗……。
爪哇缪斯
2023/09/26
1750
趣解设计模式之《小王设计的疫苗管理平台系统》
趣解设计模式之《同学们,交作业啦!》
小明学生在学校上完课回家,写完作业后,想要通过微信的方式,把作业提交给老师,但是呢,老师的微信没在线,估计是忙别的去了。
爪哇缪斯
2023/09/26
1900
趣解设计模式之《同学们,交作业啦!》
趣解设计模式之《小王的学习秘籍》
小王是学校的学霸,凭借着自己的天赋以及对于学习的刻苦,每次考试都能排到年级第一名。但是,他所在的班级总成绩却不高,在所有班级中,属于中游水平。老师希望通过小王的贡献,能否帮助整个班级同学分数都有一个提升。
爪哇缪斯
2023/09/18
2080
趣解设计模式之《小王的学习秘籍》
【万字图文】详解设计模式(下篇)
本篇关于设计模式的文章是设计模式的下篇,上下两篇文章介绍了整个23种设计模式中的22种,由于解释器模式主要应用场景是在解释器开发中,所以,该模式就只列举出了一些含义和使用场景,并没有类图和示例。而其他的22种设计模式,基本遵循的是:待解决的问题——>应用场景——>模式定义——>类图——>具体实现——>优缺点,这几方面来介绍的。那么,话不多说了,还是老样子,如下为本篇文章的整体目录:
爪哇缪斯
2023/05/10
1.2K0
【万字图文】详解设计模式(下篇)
【设计模式】第十一篇:来一起瞅瞅享元模式
前两天已经把 Redis 重新整理好了,一两天就可以发布出来啦~ 今天先继续看一下一个简单的设计模式
BWH_Steven
2021/01/24
3930
Java设计模式之享元模式
在软件设计模式中,享元模式是一种结构型模式,旨在有效地支持大量细粒度对象的共享。它通过共享相同状态的对象来最小化内存使用和提高性能。在Java中,享元模式是一个强大的工具,可用于处理大规模对象的场景,如图形用户界面(GUI)和游戏开发中的粒子系统。本教程将介绍Java中的享元模式,包括其定义、结构、工作原理以及实际应用。
刺槐儿
2024/01/29
2520
趣解设计模式之《珍爱生命,远离只狼》
小王最近打算入手一款叫《只狼》的游戏,这款游戏特别的硬核,也就是说,普通的小怪战斗力都特别的强,而作为主角的我们,也很容易被小兵打败。
爪哇缪斯
2023/09/21
1590
趣解设计模式之《珍爱生命,远离只狼》
Java设计模式之适配器模式
今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?
CoderJed
2018/09/30
4140
Java设计模式之适配器模式
初探Java设计模式4:一文带你掌握JDK中的设计模式
转自https://javadoop.com/post/design-pattern
Java技术江湖
2019/10/13
3500
趣解设计模式之《小王的披萨店续集》
在《小王的披萨店》这篇文章中,我们介绍了小王开披萨店的故事,并且为了解决多种口味披萨的扩展问题,引出了简单工厂和工厂方法模式。但是,故事仍在继续,如果芝加哥的披萨店和纽约的披萨店,要求往披萨上面加的配料都不一样,那么如何可以规范多种类型披萨的创建呢?如下图所示:
爪哇缪斯
2023/10/06
2200
趣解设计模式之《小王的披萨店续集》
趣解设计模式之《为什么租房子要找中介?》
小王大学毕业了,打算来北京闯荡一下,于是就先寄宿到了他的表姐家,白天的时候,自己在外面小区转一转,看看能不能找到可以租到的房子,他找了好几天都没有找到合适的,要么就是小区里一张租房子的广告都没有,好不容易找到几个,里面的房间大小和价格又不合适。北京实在是太大了,而且这边人生地不熟的,找房子真的是耗费了他大量的力气。
爪哇缪斯
2023/10/06
1750
趣解设计模式之《为什么租房子要找中介?》
趣解设计模式之《小王看病记》
小王最近参与了公司一个大项目,工作很忙,经常加班熬夜,满负荷工作了2个月后,项目终于如期上线,并且客户反馈也特别的好。老板很开心,知道大家为这个项目付出了很多,所以给全组同事都放了1个星期的假。
爪哇缪斯
2023/09/19
1720
趣解设计模式之《小王看病记》
趣解设计模式之《小王看病记》
小王最近参与了公司一个大项目,工作很忙,经常加班熬夜,满负荷工作了2个月后,项目终于如期上线,并且客户反馈也特别的好。老板很开心,知道大家为这个项目付出了很多,所以给全组同事都放了1个星期的假。
爪哇缪斯
2023/09/13
1850
趣解设计模式之《小王看病记》
设计模式——享元模式
设计模式——享元模式
Java架构师必看
2021/05/14
2890
设计模式——享元模式
趣解设计模式之《办理入职这么难吗?》
小王大学毕业,经过大学期间的刻苦学习,终于成功的面试上了一家公司。按照约定的时间,小王兴高采烈的来到公司前台去办理入职手续。
爪哇缪斯
2023/09/26
1490
趣解设计模式之《办理入职这么难吗?》
趣解设计模式之《庞大的组织架构带来的烦恼》
小王在一家创业公司,随着公司业务的发展,团队人数也从之前的十人左右拓展为了几百人的团队。那么,对于几百人的公司,就需要有一套清晰的组织架构了,这样会更便于公司员工的管理,以及跨部门的协同工作(某部门的领导是谁?包含哪些子部门?我这件事儿应该去找哪个部门?等等)这件事情显得愈发迫在眉睫。
爪哇缪斯
2023/09/20
2480
趣解设计模式之《庞大的组织架构带来的烦恼》
趣解设计模式之《小王的披萨店》
小王看到最近越来越多的人喜欢吃披萨了,所以,他决定自己也开一个披萨店。最初开的时候,他只提供了一种口味的披萨,因为这样先试试水,看看生意如何,如果生意不好,也可以快速止损。
爪哇缪斯
2023/09/29
1700
趣解设计模式之《小王的披萨店》
趣解设计模式之《小王的糖果售卖机》
小王最近一直在寻找商机,他发现商场儿童乐园或者中小学校周围,会有很多小朋友喜欢吃糖果,那么他想设计一款糖果售卖机,让后将这些糖果售卖机布置到商场和学校旁边,这样就能获得源源不断的收益了。
爪哇缪斯
2023/09/23
1760
趣解设计模式之《小王的糖果售卖机》
趣解设计模式之《为什么租房子要找中介?》
小王大学毕业了,打算来北京闯荡一下,于是就先寄宿到了他的表姐家,白天的时候,自己在外面小区转一转,看看能不能找到可以租到的房子,他找了好几天都没有找到合适的,要么就是小区里一张租房子的广告都没有,好不容易找到几个,里面的房间大小和价格又不合适。北京实在是太大了,而且这边人生地不熟的,找房子真的是耗费了他大量的力气。
爪哇缪斯
2023/09/12
1940
趣解设计模式之《为什么租房子要找中介?》
【设计模式】-创建型模式-第2章第5讲-【对象池模式】
对象池模式 (The Object Pool Pattern) 是单例模式的一个变种,它提供了获取一系列相同对象实例的入口。当你需要对象来代表一组可替代资源的时候就变的很有用,每个对象每次可以被一个组件使用。
跟着飞哥学编程
2022/12/02
4630
推荐阅读
相关推荐
趣解设计模式之《小王设计的疫苗管理平台系统》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档