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;

            もし(リスト== nullの|| list.Count == 0)
                リターン合計。

            //合計
            小数12月= decimal.Zero。
            foreachの(リストにおけるT OBJ)
            {
                (obj.GetType()GetPropertyメソッド(プロパティ名)ヌル以降.getvalue(OBJ)== NULLの)場合
                    続けます。
                IF(、)12アウトヌルdecimal.TryParse(obj.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ).ToString())
                    の和+ = 12月;
            }

            合計を返します。
        }

        /// <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));
            一覧<オブジェクト> sortlistがあり=新しいリスト<オブジェクト>();
            foreachの(リストにおけるT OBJ)
                sortList.Add(OBJ)。
            sortList.Sort(CombineObject(propertyNameの、sortDirection))。
            一方、(list.Count> 0)
                list.RemoveAt(0)。
            foreachの(sortlistがTでのOBJ)
                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));
            一覧<オブジェクト> sortlistがあり=新しいリスト<オブジェクト>();
            foreachの(リストにおけるT OBJ)
                sortList.Add(OBJ)。
            sortList.Sort(CombineObject(sortParas))。
            一方、(list.Count> 0)
                list.RemoveAt(0)。
            foreachの(sortlistがTでのOBJ)
                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;
            ()obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL!= nullの場合
                && obj2.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2)、NULL!= NULL)
            {
                IF(obj1.GetType ().GetProperty(プロパティ名)以降.getvalue(OBJ1、NULL)IComparableをある)
                {
                    RET =((IComparableを)obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL))
                        .CompareTo(obj2.GetType() .GetProperty(プロパティ名)以降.getvalue(OBJ2、NULL))。
                }
                他
                {
                    RET = obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL).ToString()
                        .CompareTo(obj2.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL).ToString())。
                }
            }
            そうであれば(obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL)== NULL
                && obj2.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL)== NULL)
            {
                RET = 0;
            }
            そうであれば(obj1.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1)、ヌル== NULL)
            {
                RET = -1。
            }
            そうであれば(obj2.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL)== NULL)
            {
                RET = 1。
            }

            もし(SortDirection.Desc.Equals(sortDirection))
                リターンRET * -1;
            他の
                リターンRET;
        }
    }

ます。https://my.oschina.net/cjkall/blog/195882で再現

おすすめ

転載: blog.csdn.net/weixin_33933118/article/details/91756133