利用自定义特性实现List的多属性排序

王朝学院·作者佚名  2016-05-20
窄屏简体版  字體: 小  |  中  |  大  |  超大  

利用自定义特性实现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; }); } } }

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航