■ 객체 리스트를 특정 속성 값에 따라 정렬하는 방법을 보여준다. (속성 1개만 지정)
▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; #region 객체 리스트 특정 속성 값에 따라 정렬하기 (속성 1개만 지정) - SortList<TSource>(sourceList, propertyName, sortDirection) /// <summary> /// 객체 리스트 특정 속성 값에 따라 정렬하기 (속성 1개만 지정) /// </summary> /// <typeparam name="TSource">소스 타입</typeparam> /// <param name="sourceList">소스 리스트</param> /// <param name="propertyName">속성명</param> /// <param name="sortDirection">정렬 방향</param> /// <returns>정렬 객체 리스트</returns> public List<TSource> SortList<TSource>(List<TSource> sourceList, string propertyName, string sortDirection) { int reverser = sortDirection.ToLower().StartsWith("asc") ? 1 : -1; Comparison<TSource> comparison = new Comparison<TSource> ( delegate(TSource x, TSource y) { MethodInfo methodInfo = GetCompareToMethodInfo<TSource>(x, propertyName); object xValue = x.GetType().GetProperty(propertyName).GetValue(x, null); object yValue = y.GetType().GetProperty(propertyName).GetValue(y, null); object result = methodInfo.Invoke(xValue, new object[] { yValue }); return reverser * Convert.ToInt16(result); } ); sourceList.Sort(comparison); return sourceList; } #endregion #region CompareTo 메소드 정보 구하기 - GetCompareToMethodInfo<T>(sourceObject, propertyName) /// <summary> /// CompareTo 메소드 정보 구하기 /// </summary> /// <typeparam name="TSource">소스 타입</typeparam> /// <param name="sourceObject">소스 객체</param> /// <param name="propertyName">속성명</param> /// <returns>CompareTo 메소드 정보</returns> private MethodInfo GetCompareToMethodInfo<TSource>(TSource sourceObject, string propertyName) { Type sourceType = sourceObject.GetType(); object propertyValue = sourceType.GetProperty(propertyName).GetValue(sourceObject, null); Type propertyType = propertyValue.GetType(); MethodInfo methodInfo = propertyType.GetMethod("CompareTo", new Type[] { propertyType }); return methodInfo; } #endregion |