zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    面试时会经常遇到的经典算法
    PHP面试题,自己几斤几两,看看就知道了
    springboot整合mybatis时java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    springboot项目启动无法访问到controller原因之一:引导类位置有问题
    Windows上Tomcat启动,服务中没有Tomcat
    Navicat无法启动,提示无法启动程序,因为计算机中丢失MSVCP140.dll
    未配置jdk环境变量,cmd环境能运行java -version命令
    棒谷科技java岗笔试题与初试题
    Dubbo注册中心Zookeeper安装步骤
    POST提交表单,本地Windows测试无乱码,而将项目部署到服务器端产生乱码原因之一
  • 原文地址:https://www.cnblogs.com/haoqi/p/LYDNG.html
Copyright © 2011-2022 走看看