前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对List.Sort的简单研究

对List.Sort的简单研究

作者头像
脑洞的蜂蜜
发布2018-02-02 15:27:06
6130
发布2018-02-02 15:27:06
举报
文章被收录于专栏:NetCoreNetCore

最近一直忙着修改项目中的bug,特别是一些绑定的列表排序,因为是中途加入的,所以我一般不改变别人的存储过程或者类方法,只在需要的时候帮其排序一下,不过非常郁闷。。。。。。

为什么呢???存储过程用得是传入Where后的条件,然后拼接一个sql语句- -

一开始我以为只要在拼接后面加入order by就可以了,谁知道。。。order by的条件也是传入的 再次晕!!!

好吧,那我在绑定的时候弄排序吧。。。先前一直用DataView的Sort,比较方便,只要指定排序的列名就ok了,谁知道。。。他绑定的是List<T>。。。。。怎么办。。。现在没有用过,看了下Sort方法,参数是IComparer<T> comparer,郁闷,先前一直没接触过,所以在家慢慢研究了一下,发觉很神奇,这里简单介绍下,希望大家也能帮我解答一下。

先设定个类MyClass

代码语言:js
复制
public class MyClass
    {
        private int userID;

        public int UserID
        {
            get { return userID; }
            set { userID = value; }
        }
        private string userName;

        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        private DateTime addTime;

        public DateTime AddTime
        {
            get { return addTime; }
            set { addTime = value; }
        }

        public MyClass(int userID, string userName, DateTime addTime)
        {
            this.userID = userID;
            this.userName = userName;

            this.addTime = addTime;
        }


    }

好,我现在要按照时间来倒序

因为第一次用IComparer 接口,所以做的简单点

写一个类,继承IComparer接口,实现Compare方法

代码语言:js
复制

public class MyClassComparer : IComparer<MyClass>
    {
      

        IComparer 成员
    }

测试一下:

代码语言:js
复制

class Program
    {
        static void Main(string[] args)
        {
            

            List<MyClass> userList = new List<MyClass>();

            for (int i=0; i < 50; i++)
            {
                userList.Add(new MyClass(i, "James" + i.ToString(), DateTime.Now.AddHours(i)));
            }
            
            DateTime nowTime, endTime;

            nowTime = DateTime.Now;
            foreach (MyClass c in userList)
            {
                Console.WriteLine(c.UserID + ":" + c.UserName + " at " + c.AddTime);
            }
            System.Data.DataSet ds = new System.Data.DataSet();
            
            endTime = DateTime.Now;

            Console.WriteLine("未排序所用时间" + (endTime.Ticks - nowTime.Ticks));

            nowTime = DateTime.Now;

            userList.Sort(new MyClassComparer());
            foreach (MyClass c in userList)
            {
                Console.WriteLine(c.UserID + ":" + c.UserName + " at " + c.AddTime);
               
            }

            endTime = DateTime.Now;

            Console.WriteLine("排序所用时间" + (endTime.Ticks - nowTime.Ticks));

         
            Console.ReadLine();
        }
    }

测试成功,不过一开始我在MyClasComparer.Comparer方法里没有设定等于,所以排序的时候会提示错误,而且排序的时候也不正确,看了IComparer接口对于Comparer的说明(MSDN):比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。 不太明白它是如何做到排序的,只是返回个int值就可以了。。。。

排序的时候,使用userList.Sort(new MyClassComparer().Compare);也是一样的效果,我知道ICompare使用了委托,所以在这里不需要我们来传参数了,我在Compare方法中设了断点,想看看是不是每次都是循环排序,跟踪下来是循环进行排序的,然后我想看看性能,奇怪的事情出现了。。。。

10个对象的时候,排序时间<未排序时间

100个对象的时候,排序时间>未排序时间

这个有点不太明白了,希望大家能帮我解答一下

下面是50个对象时的截图

很奇怪,排序所用时间比未排序还要短。。。为什么啊

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2008-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档