Listのソート・合計に関するUtilクラス

    /// <summary>
    /// Listに関するユーティリティクラス。
    /// </summary>
    public class ListUtil
    {
        /// <summary>
        /// 昇順・降順
        /// </summary>
        public enum SortDirection { Asc = 1, Desc = 2 };

        /// <summary>
        /// 指定されたプロパティーで合計する
        /// </summary>
        /// <param name="propertyName">プロパティー名</param>
        public static decimal Total<T>(IList<T> list, string propertyName)
        {
            decimal sum = decimal.Zero;

            if (list == null || list.Count == 0)
                return sum;

            // 合計
            decimal dec = decimal.Zero;
            foreach (T obj in list)
            {
                if (obj.GetType().GetProperty(propertyName).GetValue(obj, null) == null)
                    continue;
                if (decimal.TryParse(obj.GetType().GetProperty(propertyName).GetValue(obj, null).ToString(), out dec))
                    sum += dec;
            }

            return sum;
        }

        /// <summary>
        /// 指定されたプロパティーでソートする
        /// </summary>
        /// <param name="propertyName">プロパティー名</param>
        /// <param name="sortDirection">ソート昇順・降順</param>
        public static void Sort<T>(IList<T> list, string propertyName, SortDirection sortDirection)
        {
            // アイテムが存在しなければ、ソースしない
            if (list.Count == 0)
                return;

            // ソート
            //list.Sort(CombineObject(propertyName, sortDirection));
            List<object> sortList = new List<object>();
            foreach (T obj in list)
                sortList.Add(obj);
            sortList.Sort(CombineObject(propertyName, sortDirection));
            while (list.Count > 0)
                list.RemoveAt(0);
            foreach (T obj in sortList)
                list.Add(obj);
        }

        /// <summary>
        /// 指定されたプロパティーでソートする
        /// </summary>
        /// <param name="sortParas"></param>
        public static void Sort<T>(IList<T> list, Dictionary<string, SortDirection> sortParas)
        {
            // アイテムが存在しなければ、ソースしない
            if (list.Count == 0)
                return;

            // ソート
            //list.Sort(CombineObject(sortParas));
            List<object> sortList = new List<object>();
            foreach (T obj in list)
                sortList.Add(obj);
            sortList.Sort(CombineObject(sortParas));
            while (list.Count > 0)
                list.RemoveAt(0);
            foreach (T obj in sortList)
                list.Add(obj);
        }

        /// <summary>指定した比較メソッドを結合したデリゲートを返す。</summary>
        /// <param name="sortParas"></param>
        /// <returns>デリゲート</returns>
        private static Comparison<object> CombineObject(string propertyName, SortDirection sortDirection)
        {
            return delegate(object x, object y)
            {
                return CompareColumn(x, y, propertyName, sortDirection);
            };
        }

        /// <summary>指定した比較メソッドを結合したデリゲートを返す。</summary>
        /// <param name="sortParas"></param>
        /// <returns>デリゲート</returns>
        private static Comparison<object> CombineObject(Dictionary<string, SortDirection> sortParas)
        {
            return delegate(object x, object y)
            {
                int p = 0;
                foreach (string propertyName in sortParas.Keys)
                {
                    p = CompareColumn(x, y, propertyName, sortParas[propertyName]);
                    if (p != 0)
                        break;
                }
                return p;
            };
        }

        /// <summary>指定されたプロパティの値で比較する。</summary>
        /// <param name="obj1">オブジェクト</param>
        /// <param name="obj2">オブジェクト</param>
        /// <param name="propertyName"></param>
        /// <param name="sortDirection"></param>
        /// <returns>
        /// 同じ場合、0を返す。
        /// obj1の指定されたプロパティの値が大きい場合、0より大きい値を返す。
        /// obj2の指定されたプロパティの値が大きい場合、0より小さい値を返す。
        /// (SortOrder.Descendingの場合、*-1で戻す)
        /// </returns>
        private static int CompareColumn(object obj1, object obj2, string propertyName, SortDirection sortDirection)
        {
            int ret = 0;
            if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) != null
                && obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) != null)
            {
                if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) is IComparable)
                {
                    ret = ((IComparable)obj1.GetType().GetProperty(propertyName).GetValue(obj1, null))
                        .CompareTo(obj2.GetType().GetProperty(propertyName).GetValue(obj2, null));
                }
                else
                {
                    ret = obj1.GetType().GetProperty(propertyName).GetValue(obj1, null).ToString()
                        .CompareTo(obj2.GetType().GetProperty(propertyName).GetValue(obj2, null).ToString());
                }
            }
            else if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) == null
                && obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) == null)
            {
                ret = 0;
            }
            else if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) == null)
            {
                ret = -1;
            }
            else if (obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) == null)
            {
                ret = 1;
            }

            if (SortDirection.Desc.Equals(sortDirection))
                return ret * -1;
            else
                return ret;
        }
    }

转载于:https://my.oschina.net/cjkall/blog/195882

猜你喜欢

转载自blog.csdn.net/weixin_33933118/article/details/91756133