C# List<T>進行多字段排序

mb78 9年前發布 | 4K 次閱讀 C#

//調用方法

IList<class> List = new List<class>();

//排序字段 string[] property = new string[] { "column1","column2" }; //對應排序字段的排序方式 bool[] sort =new bool[]{ false,false };

//對 List 排序 List = new IListSort<class>(List, property,sort).Sort();

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection;

namespace Common { /// <summary> /// IList排序類 /// </summary> /// <typeparam name="T"></typeparam> public class IListSort<T> { private string[] _propertyName; private bool[] _sortBy; private IList<T> _list;

    /// <summary>
    /// 構造函數
    /// </summary>
    /// <param name="list">排序的Ilist</param>
    /// <param name="propertyName">排序字段屬性名</param>
    /// <param name="sortBy">true升序 false 降序 不指定則為true</param>
    public IListSort(IList<T> list, string[] propertyName, bool[] sortBy)
    {
        _list = list;
        _propertyName = propertyName;
        _sortBy = sortBy;
    }
    /// <summary>
    /// 構造函數
    /// </summary>
    /// <param name="list">排序的Ilist</param>
    /// <param name="propertyName">排序字段屬性名</param>
    /// <param name="sortBy">true升序 false 降序 不指定則為true</param>
    public IListSort(IList<T> list, string[] propertyName)
    {
        _list = list;
        _propertyName = propertyName;
        for (int i = 0; i < _propertyName.Length; i++)
        {
            _sortBy[i] = true;
        }
    }

    /// <summary>
    /// IList
    /// </summary>
    public IList<T> List
    {
        get { return _list; }
        set { _list = value; }
    }

    /// <summary>
    /// 排序字段屬性名
    /// </summary>
    public string[] PropertyName
    {
        get { return _propertyName; }
        set { _propertyName = value; }
    }

    /// <summary>
    /// true升序 false 降序
    /// </summary>
    public bool[] SortBy
    {
        get { return _sortBy; }
        set { _sortBy = value; }
    }

    /// <summary>
    /// 排序,插入排序方法
    /// </summary>
    /// <returns></returns>
    public IList<T> Sort()
    {
        if (_list.Count == 0) return _list;
        for (int i = 1; i < _list.Count; i++)
        {
            T t = _list[i];
            int j = i;
            while ((j > 0) && Compare(_list[j - 1], t) < 0)
            {
                _list[j] = _list[j - 1];
                --j;
            }
            _list[j] = t;
        }
        return _list;
    }

    /// <summary>
    /// 比較大小 返回值 小于零則X小于Y,等于零則X等于Y,大于零則X大于Y
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    private int Compare(T x, T y)
    {
        int i =0;
        //檢查屬性名
        for (i = 0; i < _propertyName.Length; ++i)
        {
            if (string.IsNullOrEmpty(_propertyName[i])) throw new ArgumentNullException("沒有指字對象的排序字段屬性名!");
        }

        //取屬性的屬性
        PropertyInfo[] property = new PropertyInfo[_propertyName.Length];
        for (i = 0; i < _propertyName.Length; ++i)
        {
            property[i] = typeof(T).GetProperty(_propertyName[i]);
            if (property[i] == null) throw new ArgumentNullException("在對象中沒有找到指定屬性!");
        }

        int compare = 0;
        for (i = 0; i < _propertyName.Length;++i)
        {
            compare = CompareOne(x, y, property[i], _sortBy[i]);
            if (compare != 0) return compare;
        }
        return compare;
    }

    private int CompareOne(T x,T y,PropertyInfo property,bool sortBy)
    {
        switch (property.PropertyType.ToString())
        {
            case "System.Int32":
                int int1 = 0;
                int int2 = 0;
                if (property.GetValue(x, null) != null)
                {
                    int1 = Convert.ToInt32(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    int2 = Convert.ToInt32(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return int2.CompareTo(int1);
                }
                else
                {
                    return int1.CompareTo(int2);
                }
                break;
            case "System.Double":
                double double1 = 0;
                double double2 = 0;
                if (property.GetValue(x, null) != null)
                {
                    double1 = Convert.ToDouble(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    double2 = Convert.ToDouble(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return double2.CompareTo(double1);
                }
                else
                {
                    return double1.CompareTo(double2);
                }
                break;
            case "System.String":
                string string1 = string.Empty;
                string string2 = string.Empty;
                if (property.GetValue(x, null) != null)
                {
                    string1 = property.GetValue(x, null).ToString();
                }
                if (property.GetValue(y, null) != null)
                {
                    string2 = property.GetValue(y, null).ToString();
                }
                if (sortBy)
                {
                    return string2.CompareTo(string1);
                }
                else
                {
                    return string1.CompareTo(string2);
                }
                break;
            case "System.DateTime":
                DateTime DateTime1 = DateTime.Now;
                DateTime DateTime2 = DateTime.Now;
                if (property.GetValue(x, null) != null)
                {
                    DateTime1 = Convert.ToDateTime(property.GetValue(x, null));
                }
                if (property.GetValue(y, null) != null)
                {
                    DateTime2 = Convert.ToDateTime(property.GetValue(y, null));
                }
                if (sortBy)
                {
                    return DateTime2.CompareTo(DateTime1);
                }
                else
                {
                    return DateTime1.CompareTo(DateTime2);
                }
                break;
        }
        return 0;
    }
}

}</pre>

 本文由用戶 mb78 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!