关于List.Sort想到的

最近在看 记忆失去的青春的mvc系列时 第十五讲里要实现个功能叫按表头排序 即按某一字段来排序。这样的功能在项目开发中是很常见的 。

当然最后青春通过数据库实现了排序功能。

可是我在想能不能在内存中实现排序呢?  即不通过sql查询而是通过list自己的方法Sort()来实现。当然这只是我一时兴起。关于性能问题暂不做讨论。

众所周知要比较引用类型需要实现System.Collections.IComparer 接口来具体指明比较逻辑即:

    public class Test : System.Collections.IComparer 
    {
        public string Id { get; set; }
        public string Name { get; set; }
        /// <summary>
        /// 比较
        /// </summary>
        public int Compare(object x, object y)
        {
            int result=0;
            //这里进行比较并给result赋值
            return result;
        }
    }

,或者自己定义比较方法即:

public static int Compare(Test test1, Test test2)
{
    return test1.Id.CompareTo(test2.Id);
}

但是我们需要的功能是实体每个字段都有可能来作为比较的运算逻辑。用这些方式来写一个俩个不要紧,那要是多个实体呢?每个实体有very very 多字段呢?显然会让我们眼湿的。。。

背景完毕。。割割割————————————————

显然Sort方法只是需要一个委托来进行比较,而对于表头进行排序这样的功能又有一个共性即:每次比较的都是同一列的值。那么我们是不是可以这样实现呢?

namespace LYDNG.Helper
{
    /// <summary>
    /// 实体比较类
    /// </summary>
    public class TCompare
    {
        public TCompare(string attrName)
        {
            AttrName = attrName;
        }
        /// <summary>
        /// 要比较的实体的属性名称
        /// </summary>
        private string AttrName { get; set; }

        /// <summary>
        /// 比较两个实体
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t1">实体1</param>
        /// <param name="t2">实体2</param>
        /// <returns></returns>
        public int CompareObject<T>(T t1, T t2)
        {
            int i = 0;//默认是相等的
            if (t1 != null && t2 != null)
            {
                i = getValueByAttrName<T>(t1, AttrName).CompareTo(getValueByAttrName<T>(t2, AttrName));
            }
            return i;
        }

        /// <summary>
        /// 以字符串形式获取属性值
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">实例</param>
        /// <param name="attrName">属性名</param>
        /// <returns>属性值</returns>
        public static string getValueByAttrName<T>(T t, string attrName)
        {
            string result = "";
            if (t != null && !string.IsNullOrEmpty(attrName))
            {
                object value = t.GetType().GetProperty(attrName).GetValue(t, null);
                if (value != null)
                {
                    result = value.ToString();
                }
            }
            return result;
        }
    }
}
View Code

这样在需要排序的时候只需要:

listData.Sort(new LYDNG.Helper.TCompare(attrName).CompareObject<Models.Employee>);

(这里的attrName就是用户每次点击表头时对应的字段名,而Models.Employee就是要比较的实体类型)

就可以实现泛型列表的排序了。

如果想要写法更优雅来这里:http://www.cnblogs.com/haoqi/p/3403132.html

原文地址:https://www.cnblogs.com/haoqi/p/LYDNG.html