对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个对象时的截图
很奇怪,排序所用时间比未排序还要短。。。为什么啊
- 日志分析实战之清洗日志小实例3:如何在spark shell中导入自定义包
- PHP-函数
- hdu----(5045)Contest(数位dp)
- hdu----(5053)the Sum of Cube(签到题,水体)
- RHEL构建DNS服务器-多区域
- hdu----(5050)Divided Land(二进制求最大公约数)
- 日志分析实战之清洗日志小实例1:使用spark&Scala分析Apache日志
- RHEL构建DNS服务器-单区域
- hdu----(5047)Sawtooth(大数相乘+数学推导)
- hdu----(4522)湫湫系列故事——过年回家(最短路)
- hdu---(1421)搬寝室(dp)
- hdu----(1257)最少拦截系统(dp/LIS)
- nginx安装Fancy美化索引目录
- hdu---(3779)Railroad(记忆化搜索/dfs)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数组reduce方法的高级用法
- 十七、详解 ES6 Modules
- 超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵肝出了这份图解!
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php
- Prism代码高亮Pjax重载函数
- Qt示例-AnalogClock-自定义窗体-使用QPainter的转换和缩放特性简化绘图
- 2019-12-27-traefik
- 2019-12-05-eck-qustion
- 聊聊dubbo-go的ConsumerSignFilter
- Javascript错误处理
- 程序员说模型过拟合的时候,说的是什么?