国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

利用自定義特性實現(xiàn)List的多屬性排序

2019-11-17 02:31:40
字體:
供稿:網(wǎng)友

利用自定義特性實現(xiàn)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 簡單測試數(shù)據(jù) 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

//調(diào)用多字段排序 SortMutiplePropertyHelper<MyClass>.SortMutipleProperty(list);

//可以復(fù)用 SortMutiplePropertyHelper<MySecondClass>.SortMutipleProperty(new List<MySecondClass>());

//輸出排序結(jié)果 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)) { //這里簡單的把屬性轉(zhuǎn)成字符串對比,比較靠譜的做法應(yīng)當(dāng)是針對不同的類型去做不同的比較。 string v1 = attr.Key.GetValue(t1).ToString(); string v2 = attr.Key.GetValue(t2).ToString(); result = v1.CompareTo(v2); if (result != 0) { break; } }

return result; }); } } }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁波市| 平阴县| 秦安县| 石景山区| 新沂市| 安远县| 个旧市| 年辖:市辖区| 镇宁| 文成县| 江永县| 丰台区| 遂溪县| 胶南市| 广宗县| 三穗县| 申扎县| 墨竹工卡县| 荔浦县| 乾安县| 平凉市| 西华县| 德格县| 大宁县| 进贤县| 南宁市| 康马县| 德惠市| 界首市| 永胜县| 綦江县| 孟州市| 富川| 乌拉特后旗| 安阳县| 满城县| 肃宁县| 福安市| 泸西县| 剑阁县| 华坪县|