zoukankan      html  css  js  c++  java
• # 利用自定义特性实现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;

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,
},
new MyClass()
{
P1="h1",
P2=2,
},
new MyClass()
{
P1="h3",
P2=1,
P3=DateTime.Now
},
new MyClass()
{
P1="h1",
P2=1,
P3=DateTime.Now
},
new MyClass()
{
P1="h2",
P2=2,
},
};
#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)
{
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;
});
}
}
}

• 相关阅读:
安装Bind到CentOS（YUM）
安装Ansible到CentOS（YUM）
安装AB到CentOS（YUM）
安装APACHE到CentOS（YUM）
07 Spring Cloud Eureka是什么？
06 Spring Boot Starter的介绍及使用
05 Spring Boot项目搭建步骤（超详细）
04 Spring Cloud开发环境的准备和Lombok安装步骤
03 Spring Cloud和Dubbo的区别及各自的优缺点
02 Spring Cloud 模块介绍
• 原文地址：https://www.cnblogs.com/12taotie21/p/4340485.html