知道linq有order by的功能,但是还是动手研究了一下,算是多实践实践反射。这篇算是笔记,直接上代码:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace TestMultiplePropertySort
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 简单测试数据
            var list = new List<MyClass>()
            {
                new MyClass()
                {
                    P1="h3",
                    P2=1,
                    P3=DateTime.Now
                },
                new MyClass()
                {
                    P1="h2",
                    P2=3,
                    P3=DateTime.Now.AddHours(-1)
                },
                new MyClass()
                {
                    P1="h1",
                    P2=2,
                    P3=DateTime.Now.AddHours(1)
                },
                new MyClass()
                {
                    P1="h3",
                    P2=1,
                    P3=DateTime.Now
                },
                new MyClass()
                {
                    P1="h1",
                    P2=1,
                    P3=DateTime.Now
                },
                new MyClass()
                {
                    P1="h2",
                    P2=2,
                    P3=DateTime.Now.AddHours(1)
                },
            };
            #endregion

//调用多字段排序
            SortMutiplePropertyHelper<MyClass>.SortMutipleProperty(list);

//可以复用
            SortMutiplePropertyHelper<MySecondClass>.SortMutipleProperty(new List<MySecondClass>());

//输出排序结果
            list.ForEach(m => Trace.WriteLine(m.ToString()));
        }
    }

public class MyClass
    {
        [SortOrder(0)]
        public string P1 { get; set; }

[SortOrder(1)]
        public int P2 { get; set; }

[SortOrder(2)]
        public DateTime P3 { get; set; }

public override string ToString()
        {
            return P1.ToString() + "," + P2.ToString() + "," + P3.ToString();
        }
    }

public class MySecondClass
    {
       
    }

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class SortOrderAttribute : Attribute
    {
        public int Order { get; set; }
        public SortOrderAttribute(int order)
        {
            this.Order = order;
        }
    }

public class SortMutiplePropertyHelper<T> where T : class ,new()
    {
        /// <summary>
        /// 保存属性和顺序的字典
        /// </summary>
        public static readonly Dictionary<PropertyInfo, SortOrderAttribute> attrDic = new Dictionary<PropertyInfo, SortOrderAttribute>();

static SortMutiplePropertyHelper()
        {
            //初始化order字段
            Type t = typeof(T);
            foreach (var prop in t.GetProperties())
            {
                foreach (var sortOrderAttribute in prop.GetCustomAttributes(typeof(SortOrderAttribute), false))
                {
                    if (sortOrderAttribute is SortOrderAttribute)
                    {
                        attrDic.Add(prop, sortOrderAttribute as SortOrderAttribute);
                        break;
                    }
                }
            }
        }

public static void SortMutipleProperty(List<T> list)
        {
            list.Sort((t1, t2) =>
            {
                int result = 0;

foreach (var attr in  attrDic.OrderBy(key => key.Value.Order))
                {
                    //这里简单的把属性转成字符串对比,比较靠谱的做法应当是针对不同的类型去做不同的比较。
                    string v1 = attr.Key.GetValue(t1).ToString();
                    string v2 = attr.Key.GetValue(t2).ToString();
                    result = v1.CompareTo(v2);
                    if (result != 0)
                    {
                        break;
                    }
                }

return result;
            });
        }
    }
}

利用自定义特性实现List的多属性排序的更多相关文章

  1. 如何获取类或属性的自定义特性(Attribute)

    如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...

  2. C# winform利用反射和自定义特性加载功能模块(插件式开发)

    由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...

  3. 利用自定义的AuthenticationFilter实现Basic认证

    [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证   很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前 ...

  4. ____利用C#特性Attribute完成对sql语句的拼接

    //定义 特性类: public class MyAttribute : Attribute//自定义注解类判断是否是主键 { public bool PrimaryKey = false; publ ...

  5. 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版

    代码走查25条疑问   代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...

  6. Attribute自定义特性+Asp.net MVC中的filter详解

    转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...

  7. C#反射与特性(七):自定义特性以及应用

    目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...

  8. JavaScript特性(attribute)、属性(property)和样式(style)

    最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...

  9. 【.net 深呼吸】自定义特性(Attribute)的实现与检索方法

    在.net的各个语言中,尤其是VB.NET和C#,都有特性这一东东,具体的概念,大家可以网上查,这里老周说一个非标准的概念——特性者,就是对象的附加数据.对象自然可以是类型.类型成员,以及程序集. 说 ...

随机推荐

  1. unity googleplay随手记

    googleplay设置 进入play console后可以发布应用 点击所有应用->创建应用(这部经常报错误码,多试几次就ok可能和vpn有关) 创建一个应用成功后,这个应用就会包含上面所有选 ...

  2. [SinGuLaRiTy] (树形)数据结构题目复习

    [SinGuLaRiTy-1023] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 普通平衡树 题目描述 你需要写一种数据结构(可参考题目标 ...

  3. ASP.NET-GridView之导出excel或word

    在CS阶段我们涉及到表格的导出,再Web开发同样可以实现,而且实现形式多种多样.以下面的例子说明表格导出到excel和word 这里用到了一个后台方法输出流形成***文件的的公共方法 DEMO < ...

  4. See Elevator Run Floors

    “在我短暂的电梯作业中我发现,架构的优化能力是有限的.越是工于优化算法…越是会被自己的架构所制约….想要更好的优化,唯有超越架构………" 零.基础 优化建立在架构之上,这句话莫得问题,也莫得 ...

  5. js window.open()打开的页面关闭后刷新父页面

    function test(){ var winObj = window.open(URL); var loop = setInterval(function(){ if(winObj.closed) ...

  6. P1527 [国家集训队]矩阵乘法

    \(\color{#0066ff}{ 题目描述 }\) 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. \(\color{#0066ff}{输入格式}\) 第一行两个数N,Q ...

  7. luogu3380 树套树之线段树套线段树

    个人感觉可能是最不需要脑子写的方法 不过也不太好调 就是用一个普通的线段树维护这个序列,但是对于线段树的每一个区间,再开一个动态开点的权值线段树,里面存储这个区间所有元素值 单点修改只会涉及到log棵 ...

  8. C++基础学习10:继承

    继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承可以理解为一个类从另一个类获取方法(函数)和属性(成员变量)的过程.如果类B继承于类A,那么B就 ...

  9. 详解linux下批量替换文件内容的三种方法(perl,sed,shell)

    在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...

  10. Android自动化----adb shell,appium,uiautomator2

    1.区别 1,adb shell脚本的方式 不但可以在有电脑的情况下使用,通过数据线连接电脑然后adb shell命令,而且还可以打包成app,在手机的终端使用adb shell命令. 2,appiu ...