对List.Sort的简单研究

简介: 最近一直忙着修改项目中的bug,特别是一些绑定的列表排序,因为是中途加入的,所以我一般不改变别人的存储过程或者类方法,只在需要的时候帮其排序一下,不过非常郁闷。。。。。。   为什么呢???存储过程用得是传入Where后的条件,然后拼接一个sql语句- - 一开始我以为只要在拼接后面加入order by就可以了,谁知道。

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

 

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

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

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

先设定个类MyClass

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
public class MyClass
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    
{
        
private int userID;

        
public int UserID
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return userID; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { userID = value; }
        }

        
private string userName;

        
public string UserName
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return userName; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { userName = value; }
        }

        
private DateTime addTime;

        
public DateTime AddTime
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return addTime; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { addTime = value; }
        }


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

            
this.addTime = addTime;
        }



    }

 

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

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

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

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif MyClassComparer
public class MyClassComparer : IComparer<MyClass>
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    
{
      

img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
IComparer 成员#region IComparer<MyClass> 成员

        
//比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
        public int Compare(MyClass x, MyClass y)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//因为是倒序,所以如果x的时间大于y的时间,返回负数
            if (x.AddTime > y.AddTime)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
return -1;
            }

            
else if (x.AddTime < y.AddTime)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
return 1;
            }

            
else
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
return 0;
            }

            
        }


        
#endregion

    }

 

测试一下:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Program
class Program
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    
{
        
static void Main(string[] args)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            

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

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

            
            DateTime nowTime, endTime;

            nowTime 
= DateTime.Now;
            
foreach (MyClass c in userList)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                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)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                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个对象时的截图

 

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

 

相关文章
|
6月前
|
机器学习/深度学习 算法 计算机视觉
SORT新方法AM-SORT | 超越DeepSORT/CO-SORT/CenterTrack等方法,成为跟踪榜首
SORT新方法AM-SORT | 超越DeepSORT/CO-SORT/CenterTrack等方法,成为跟踪榜首
261 0
LeetCode 148. Sort List
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
72 0
LeetCode 148. Sort List
|
搜索推荐 开发者 Python
sort 方法的使用 | 学习笔记
快速学习 sort 方法的使用
sort 方法的使用 | 学习笔记
|
算法 安全 Java
Array,List,Set及Map遍历内容的方法探究
Array,List,Set及Map遍历内容的方法探究
4.1、Array数组常用的方法(map、push、sort、filter、join、split)
4.1、Array数组常用的方法(map、push、sort、filter、join、split)
141 0
|
Python
Python编程:列表List.sort和sorted方法排序
Python编程:列表List.sort和sorted方法排序
121 0
|
存储 缓存 C++
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比 下
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比
138 0
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比 下
|
存储 算法 C语言
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比 上
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比
195 0
【C++初阶:STL —— list】list的介绍及使用 | list的深度剖析及模拟实现 | list与vector的对比 上
【1028】List Sorting (25 分)
【1028】List Sorting (25 分) 【1028】List Sorting (25 分)
98 0
|
搜索推荐 算法 vr&ar
Excel Sort的多key稳定排序算法,你了解的有多少方法?
<p>  一般说,由Excel中的单元格区域数据对象构成的二维数组,可以直接使用工作表排序方法。</p> <p>  不仅速度快,而且无需读入、写出操作。</p> <p>  但是,默认工作表排序方法一次只能使用3个key、所以如果有较多key需要排序时,</p> <p>  可以使用VBA循环代码,一次排1列,逆序循环排序后得到结果。</p> <p>  PS:注意必须逆序操
389 0