zoukankan      html  css  js  c++  java
  • c# list排序的三种实现方式

    用了一段时间的gridview,对gridview实现的排序功能比较好奇,而且利用C#自带的排序方法只能对某一个字段进行排序,今天demo了一下,总结了三种对list排序的方法,并实现动态传递字段名对list进行排序。

    首先先介绍一下平时最常用的几种排序方法。

    第一种:实体类实现IComparable接口,而且必须实现CompareTo方法

    实体类定义如下:

    class Info:IComparable
        {
            public int Id { get; set; }
            public string Name { get; set; }

            public int CompareTo(object obj) {
                int result;
                try
                {
                    Info info = obj as Info;
                    if (this.Id > info.Id)
                    {
                        result = 0;
                    }
                    else
                        result = 1;
                    return result;
                }
                catch (Exception ex) { throw new Exception(ex.Message); }
            }
        }

    调用方式如下,只需要用sort方法就能实现对list进行排序。

    private static void ReadAccordingCompare()

    {
                List<Info> infoList = new List<Info>();
                infoList.Add(
                    new Info() { Id = 1, Name = "abc" });
                infoList.Add(new Info() { Id = 3, Name = "rose" });
                infoList.Add(new Info() { Id = 2, Name = "woft" });
                   infoList.Sort();
                foreach (var item in infoList)
                {
                    Console.WriteLine(item.Id + ":" + item.Name);
                }
    }

    第二种方法:linq to list进行排序

    运用linq实现对list排序,在实体类定义的时候就不需用实现IComparable接口,调用方式如下:

    private static void ReadT(string str)

    {
                List<Info> infoList = new List<Info>();
                infoList.Add(
                    new Info() { Id = 1, Name = "woft" });
                infoList.Add(new Info() { Id=3,Name="rose"});
                infoList.Add(new Info() { Id = 2, Name = "abc" });
                Console.WriteLine("ReadT*********************");
                IEnumerable<Info> query = null;
                query = from items in infoList orderby items.Id select items;
                foreach (var item in query)
                {
                    Console.WriteLine(item.Id+":"+item.Name);
                }
    }

    但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的if进行判断,这样显得很麻烦。

    且看下面的方式实现根据传入参数进行排序。

    private static void ListSort(string field,string rule)
            {
                if (!string.IsNullOrEmpty(rule)&&(!rule.ToLower().Equals("desc")||!rule.ToLower().Equals("asc")))
                {
                    try
                    {
                        List<Info> infoList = GetList();
                        infoList.Sort(
                            delegate(Info info1, Info info2)
                            {
                                Type t1 = info1.GetType();
                                Type t2 = info2.GetType();
                                PropertyInfo pro1 = t1.GetProperty(field);
                                PropertyInfo pro2 = t2.GetProperty(field);
                                return rule.ToLower().Equals("asc") ?
                                    pro1.GetValue(info1, null).ToString().CompareTo(pro2.GetValue(info2, null).ToString()) :
                                    pro2.GetValue(info2, null).ToString().CompareTo(pro1.GetValue(info1, null).ToString());
                            });
                        Console.WriteLine("*****ListSort**********");
                        foreach (var item in infoList)
                        {
                            Console.WriteLine(item.Id + "," + item.Name);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                } Console.WriteLine("ruls is wrong");

            }

    调用方式:

    ListSort("Name","desc");//表示对Name进行desc排序
    ListSort("Id","asc");//表示对Id进行asc排序。如此如果参数很多的话减少了很多判断。

    如果有更好的方法欢迎提出,共同学习………..

    后续:受一位留言着的提醒,在用反射实现多字段排序时只需一次反射,多余的一次放而会影响性能,现更新如下:

    private static void ListSort(string field,string rule)
            {
                if (!string.IsNullOrEmpty(rule) && (rule.ToLower().Equals("desc") || rule.ToLower().Equals("asc")))
                {
                    try
                    {
                        List<Info> infoList = GetList();
                        infoList.Sort(
                            delegate(Info info1, Info info2)
                            {
                                Type t = typeof(Info);
                                PropertyInfo pro = t.GetProperty(field);
                                return rule.ToLower().Equals("asc") ?
                                    pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) :
                                    pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString());
                            });
                        Console.WriteLine("*****ListSort**********");
                        foreach (var item in infoList)
                        {
                            Console.WriteLine(item.Id + "," + item.Name);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                else
                    Console.WriteLine("ruls is wrong");
            }

    from: http://www.cnblogs.com/bradwarden/archive/2012/06/19/2554854.html

  • 相关阅读:
    jquery获取网页在浏览器中可见宽度与高度
    mysql子查询
    ffmpeg 转码并截图的命令分析
    mysql find_in_set 与 in 的用法与区别,mysql范围搜索,mysql范围查询
    CSS一行显示,显示不下的用省略号显示
    js如何通过变量调用函数,函数名在变量里面
    jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身)
    解决JS浮点数(小数)计算加减乘除的BUG
    php裁剪图片
    百度蜘蛛ip段代表的不同含义
  • 原文地址:https://www.cnblogs.com/yuxuetaoxp/p/3448917.html
Copyright © 2011-2022 走看看