利用自定义特性实现List的多属性排序
知道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的多属性排序的更多相关文章
- 如何获取类或属性的自定义特性(Attribute)
如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...
- C# winform利用反射和自定义特性加载功能模块(插件式开发)
由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...
- 利用自定义的AuthenticationFilter实现Basic认证
[ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证 很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前 ...
- ____利用C#特性Attribute完成对sql语句的拼接
//定义 特性类: public class MyAttribute : Attribute//自定义注解类判断是否是主键 { public bool PrimaryKey = false; publ ...
- 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版
代码走查25条疑问 代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...
- Attribute自定义特性+Asp.net MVC中的filter详解
转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...
- C#反射与特性(七):自定义特性以及应用
目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...
- JavaScript特性(attribute)、属性(property)和样式(style)
最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...
- 【.net 深呼吸】自定义特性(Attribute)的实现与检索方法
在.net的各个语言中,尤其是VB.NET和C#,都有特性这一东东,具体的概念,大家可以网上查,这里老周说一个非标准的概念——特性者,就是对象的附加数据.对象自然可以是类型.类型成员,以及程序集. 说 ...
随机推荐
- 【TED演讲】阿帕玛・饶:(幽默的高科技艺术)
身为艺术家和TED Fellow的阿帕玛・饶对熟悉的事物以惊奇的幽默的方式进行再次想像.通过和索伦・普尔兹的合作,她创作出一系列高科技的艺术作品-一个会发邮件的打字机,一个让你在屏幕上消失而跟踪拍摄你 ...
- web.xml 有什么用?(Java框架)
1.每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程 ...
- Java编码思想之什么是高内聚低耦合?
分别描述的是模块内部特征,和模块外部引用关系. 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高. 内聚是就其中任何一个模块的内部特征而言的. 耦合是就多 ...
- javascript判断访问终端,手机端自动跳转
在网页的顶部加入javascript判断代码: function checkserAgent(){ var userAgentInfo=navigator.userAgent; var userAge ...
- sql_trace基本用法
sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述: SQL_TRACE是Oracle的一个非常强大的工 ...
- SAP ABAP ALV构建动态输出列与构建动态内表(包留备用),包含操作abap元类型表及类
https://blog.csdn.net/zhongguomao/article/details/51095946
- Index Filter及ICP特性
原文链接:http://hedengcheng.com/?p=577 (一)问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生 ...
- 在使用jquery时,(e.target).closest("li")是什么意思
今天在群里有童鞋问以下代码中: $(function(){ $(document).bind("click", function (e) { $(e.target).closest ...
- 传球游戏 dp
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:nnn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每 ...
- 过河卒 NOIp 2002 dp
题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦 ...