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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于反射、泛型的不定参数、不定类型的排序
方法相关 参数: string数组 - 全部要比较的字段名称 bool数组 - 每一个字段升序排序还是降序排序 IList<T>集合 - 要排序的List
祝你万事顺利
2019/06/13
1.9K0
如何获取 C# 类中发生数据变化的属性信息
在平时的开发中,当用户修改数据时,一直没有很好的办法来记录具体修改了那些信息,只能暂时采用将类序列化成 json 字符串,然后全塞入到日志中的方式,此时如果我们想要知道用户具体改变了哪几个字段的值的话就很困难了。因此,趁着这个假期,就来解决这个一直遗留的小问题,本篇文章记录了我目前实现的方法,如果你有不同于文中所列出的方案的话,欢迎指出。
程序员宇说
2020/02/18
3.6K0
如何获取 C# 类中发生数据变化的属性信息
C#List的排序和简单去重总结
      List集合在开发过程中很常见,经常我们要对该集合进行一系列操作,本文介绍如何将该集合内的元素进行排序,博主制作简单WinForm应用程序进行演示。       首先,我们来看一下c#泛型List提供的Sort方法: 这里有泛型List类的Sort方法的三种形式,分别是 1,不带有任何参数的Sort方法----Sort(); 这种排序List中的元素必须继承IComparable接口,并且要实现IComparable接口中的CompareTo()方法,在CompareTo()方法中要实现比较规则
用户1055830
2018/01/18
1.3K0
C#List的排序和简单去重总结
DataGridView绑定BindingList<T>带数据排序的类
本文章转载:http://yuyingying1986.blog.hexun.com/30905610_d.html
跟着阿笨一起玩NET
2018/09/19
1.8K0
c#多选下拉框(ComboBox)
代码如下 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Data; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Collections; 10 u
冰封一夏
2019/09/11
8.8K1
C# 使用反射获取私有属性的方法 测试
本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多
林德熙
2019/03/13
2.4K0
c# 自定义多选下拉列表2
以下为工作中遇到的,备注一下 先需要几个辅助类 1 #region GripBounds 2 3 using System.Drawing; 4 internal struct GripBounds 5 { 6 private const int GripSize = 6; 7 private const int CornerGripSize = GripSize << 1; 8 9 public GripBounds(Rectangle cl
冰封一夏
2019/09/11
3K0
.NET常用的扩展方法整理
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; namespace IBO.XJMYQP.Utility { public static class Extens
跟着阿笨一起玩NET
2018/09/19
1.2K0
NopCommerce开源项目中很基础但是很实用的C# Helper方法
刚过了个五一,在杭州到处看房子,不知道杭州最近怎么了,杭州买房的人这么多,房价涨得太厉害,这几年翻倍翻倍地涨,刚过G20,又要亚运会,让我这样的刚需用户买不起,也买不到房子,搞得人心惶惶,太恐怖了,心好累。
码农阿宇
2018/05/03
8250
【c#】把Dataset类型转为List<T>
之前分享过将从数据库查出来的datatable数据分页,然后将每一页的数据转成list。前几天搭档觉得这个过程太复杂,建议直接读取数据库返回泛型集合,如题目所说的把dataset类型的数据转为List<T>泛型集合,不过这样做也需要对list进行分页。本着学习的态度,昨天实践了一下这种方法,主要是封装一个dataset to list的工具类。主要代码如下:
全栈程序员站长
2022/08/10
1.4K0
Asp.Net Core 扩展 Linq,简化自定义
在 Asp.Net Core 开发中或者其他的后端开发中都会有一个需求(尤其对于中台或者后台管理),那就是展示数据列表;当然不是普普通通的数据列表展示,而是需要进行排序、分页、查询关键字来获取列表。
SpiritLing
2021/03/16
1.8K0
List的多维度排序案例演示~
关于List的多维度排序 日常工作中有很多关于list的排序功能, 看到公司封装的一个比较好的工具类, 这里拿来记录学习下。 public class SortBuilder<T> { // Never make these public static final int LEFT_IS_GREATER = 1; static final int RIGHT_IS_GREATER = -1; private static final Logger log = LoggerF
一枝花算不算浪漫
2018/05/18
1K0
使用贝叶斯做英文拼写检查(c#)
贝叶斯算法可以用来做拼写检查、文本分类、垃圾邮件过滤等工作,前面我们用贝叶斯做了文本分类,这次用它来做拼写检查,参考:How to Write a Spelling Corrector 拼写检查器的原理 给定一个单词, 我们的任务是选择和它最相似的拼写正确的单词.   对应的贝叶斯问题就是, 给定一个词 w, 在所有正确的拼写词中, 我们想要找一个正确的词 c, 使得对于 w 的条件概率最大, 也就是说: argmaxc P(c|w) 按照贝叶斯理论上面的式子等价于: argmaxc P(w|c) P(c)
JadePeng
2018/03/12
1.4K0
使用贝叶斯做英文拼写检查(c#)
在ListView中实现排序
ListView触发数据源排序,使用数据源(即List<T>)的Sort()方法,又一次绑定数据源到ListView。
全栈程序员站长
2022/09/06
1.4K0
C# 数组基础
一、数组的基础知识 1、数组有什么用? 如果需要同一个类型的多个对象,就可以使用数组。数组是一种数组结构,它可以包含同一个类型的多个元素. 2、数组的初始化方式 第一种:先声明后赋值 int[] ar
郑小超.
2018/01/26
1.2K0
.NET实现之(简易ORM)
ORM模型在现在的项目开发中用的还是比较多的,他的好坏我们就不讨论了,已学习为主吧;
王清培
2022/03/14
7040
.NET实现之(简易ORM)
WPF:数据虚拟化
A collection class providing data virtualization with large data sets.
沙漠尽头的狼
2022/04/18
5580
WPF:数据虚拟化
还在拼冗长的WhereIf吗?100行代码解放这个操作
最原始的做法我们是先通过If()判断是否需要进行数据过滤,然后再对数据源使用Where来过滤数据。 示例如下:
饭勺oO
2024/06/06
1160
还在拼冗长的WhereIf吗?100行代码解放这个操作
反射 与 特性 与动态数据解析 针对与Byte类型
下面是工作记录,用于与硬件对接,都是16进制数据处理 [类与数据] [数据与类] 的来回转换 要与添加有特性的类结合使用 可支持多字节与单字节解析  这属于工作记录,不懂可以联系我哦 【特性定义】 /// <summary> /// 记录截取位 /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)] public class TruncateLocati
Shunnet
2022/05/31
3560
C#操作json的通用帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; using System.Data.Common; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Runtime.Serialization.Jso
用户7108768
2021/11/02
1.4K0
相关推荐
基于反射、泛型的不定参数、不定类型的排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验