zoukankan      html  css  js  c++  java
  • 实现List的多列排序

    List的sort()方法,只能实现简单数据的排序,如过List里面装的是对象,就必须要显示实现IComparer接口,才能排序,并且有时我们需要对一个对象进行多列排序,如学生按学号,成绩升序排列。在实现这个接口的时候,我们可以对多个字段排序,代码如下:

            public class People
            {
                public string  Sex { get; set; }
                public int Age { get; set; }
                public string Name { get; set; }
            }
            public class PeopleComparer : IComparer<People>
            {
                private bool bASC;
                public PeopleComparer(bool asceding)
                {
                    bASC = asceding;
                }
    
                #region IComparer<Student> 
                public int Compare(People x, People y)
                {
                    if (!bASC)
                    {
                        //降序
                        People temp;
                        temp = y;
                        y = x;
                        x = temp;
                    }
    
                    int flg = -1;
                    flg = Comparer<string >.Default.Compare(x.Sex, y.Sex);
                    if (flg == 0)
                    {
                        flg = Comparer<int>.Default.Compare(x.Age, y.Age);
                    }
                    if (flg == 0)
                    {
                        flg = Comparer<string>.Default.Compare(x.Name, y.Name);
                    }
                    return flg;
                }
    
                #endregion
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                List<People> lstPeople = new List<People>();
                lstPeople.Add(new People{  Sex ="man", Age =40, Name ="name1"});
                lstPeople.Add(new People { Sex = "woman", Age = 15, Name = "name11" });
                lstPeople.Add(new People { Sex = "man", Age = 35, Name = "name4" });
                lstPeople.Add(new People { Sex = "man", Age = 55, Name = "name3" });
                lstPeople.Add(new People { Sex = "man", Age = 35, Name = "name5" });
                lstPeople.Add(new People { Sex = "man", Age = 60, Name = "name2" });
                lstPeople.Add(new People { Sex = "woman", Age = 27, Name = "name15" });
                lstPeople.Add(new People { Sex = "woman", Age = 37, Name = "name14" });
                lstPeople.Add(new People { Sex = "woman", Age = 27, Name = "name12" });
                lstPeople.Add(new People { Sex = "woman", Age = 47, Name = "name13" });
    
                System.Diagnostics.Debug.WriteLine("原始数据:");
                DispPeople(lstPeople);
    
                System.Diagnostics.Debug.WriteLine("升序排列:");
                PeopleComparer ascCompare = new PeopleComparer(true);
                lstPeople.Sort(ascCompare);
                DispPeople(lstPeople);
    
                System.Diagnostics.Debug.WriteLine("降序排列:");
                PeopleComparer descCompare = new PeopleComparer(false );
                lstPeople.Sort(descCompare);
                DispPeople(lstPeople);
            }
    
            private void DispPeople(IEnumerable<People> peoples)
            {
                foreach (People p in peoples)
                {
                    System.Reflection.PropertyInfo[] pInfos = p.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
                        string str = "";
                        foreach (System.Reflection.PropertyInfo pi in pInfos)
                    {
                        str += pi.Name + ":" + pi.GetValue(p, null).ToString().PadRight(10,' ');
                    }
                        System.Diagnostics.Debug.WriteLine(str);
                }
            }

    代码实现了按人的性别,年龄,名字排序,可以实现升序和降序。

    结果:

    原始数据:
    Sex:man       Age:40        Name:name1     
    Sex:woman     Age:15        Name:name11    
    Sex:man       Age:35        Name:name4     
    Sex:man       Age:55        Name:name3     
    Sex:man       Age:35        Name:name5     
    Sex:man       Age:60        Name:name2     
    Sex:woman     Age:27        Name:name15    
    Sex:woman     Age:37        Name:name14    
    Sex:woman     Age:27        Name:name12    
    Sex:woman     Age:47        Name:name13    
    升序排列:
    Sex:man       Age:35        Name:name4     
    Sex:man       Age:35        Name:name5     
    Sex:man       Age:40        Name:name1     
    Sex:man       Age:55        Name:name3     
    Sex:man       Age:60        Name:name2     
    Sex:woman     Age:15        Name:name11    
    Sex:woman     Age:27        Name:name12    
    Sex:woman     Age:27        Name:name15    
    Sex:woman     Age:37        Name:name14    
    Sex:woman     Age:47        Name:name13    
    降序排列:
    Sex:woman     Age:47        Name:name13    
    Sex:woman     Age:37        Name:name14    
    Sex:woman     Age:27        Name:name15    
    Sex:woman     Age:27        Name:name12    
    Sex:woman     Age:15        Name:name11    
    Sex:man       Age:60        Name:name2     
    Sex:man       Age:55        Name:name3     
    Sex:man       Age:40        Name:name1     
    Sex:man       Age:35        Name:name5     
    Sex:man       Age:35        Name:name4  

      

  • 相关阅读:
    HTML
    数据库
    EF增删查改(三)------终极版
    三层的之间的引用
    sql:PostgreSQL
    csharp:SQLite and Access using C# code read data
    sql:Mysql create view,function,procedure
    sql: MySQL and Microsoft SQL Server Stored Procedures IN, OUT using csharp code
    Working C# code for MySql5.5 Stored Procedures IN parameters
    csharp:search and Compare string
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/2578806.html
Copyright © 2011-2022 走看看