对List.Sort的简单研究

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

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

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

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

先设定个类MyClass

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方法

public class MyClassComparer : IComparer<MyClass>
    {
      

        IComparer 成员
    }

测试一下:

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个对象时的截图

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农分享

LinqToExcel.Extend 源码分析

展开目录结构,我们能够更加请详细的分析出每个目录所完成的功能模块。 这里主要讲解工具集中最重要的一个模块Validate

16440
来自专栏Golang语言社区

[转载]Golang 编译成 DLL 文件

首先撰写 golang 程序 exportgo.go: package main import "C" import "fmt" //export Print...

40740
来自专栏数据结构与算法

BZOJ1269: [AHOI2006]文本编辑器editor

Descriptio 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗? 为了明确任务目标,可可对“文本编辑器...

30170
来自专栏跟着阿笨一起玩NET

关于webservice不支持方法重载的解决办法

15310
来自专栏jeremy的技术点滴

py3_cookbook_notes_02

397120
来自专栏草根专栏

.NET Core/.NET之Stream简介

之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的...

42640
来自专栏逆向与安全

菜鸟 学注册机编写之 “查表”

2.载入OD通过下MessageBoxA函数, F9运行程序, 随便输入用户名与注册码, 点ok后断下,如下图所示:

10200
来自专栏葡萄城控件技术团队

值得 .NET 开发者了解的15个特性

本文列举了 15 个值得了解的 C# 特性,旨在让 .NET 开发人员更好的使用 C# 语言进行开发工作。 1. ObsoleteAttribute Obsol...

37490
来自专栏码匠的流水账

聊聊eureka server的response cache

eureka-core-1.8.8-sources.jar!/com/netflix/eureka/resources/ApplicationResource....

12330
来自专栏技术博客

设计模式之四(抽象工厂模式第三回合)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

13220

扫码关注云+社区

领取腾讯云代金券