none
List的动态排序. RRS feed

  • 问题

  • 一个List<MyClass>  , 当我传入一个字符串,这个字符串是MyClass的一个属性名称, 比如说是MyName, 那么我想根据MyName来排序, 还可以传入一个布尔值,指定是否是降序

     

    public void SortList( List<MyClass> lst , string 排序的名称 , bool 是否降序 )

    {

    以"排序的名称" 对lst 进行排序.

    }

     

    这样说应该很容易懂吧.


    学习者
    2009年12月8日 13:31

答案

  • 你好!
         你可以自定义List<T>.Sort方法的比较器来实现,具体可以参考:
         http://msdn.microsoft.com/zh-cn/library/234b841s.aspx

    周雪峰
    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月8日 15:31
    版主
  • 写个简单的参考
      public class myclass
        {
           public  string  myname
            {
                get;
                set;
            }
     
        }
        class Program
        {
        

            static void Main(string[] args)
            {
                int[] i ={10,3,6,9,8,5,2,1,7,4,0};

                List<myclass> lm = new List<myclass>();
                foreach (int q in i)
                {
                    myclass mc = new myclass { myname="AA"+q.ToString()};
                    lm.Add(mc);
                }
     var w= lm.OrderByDescending(of => of.myname  ); 或者lm.OrderBy(of => of.myname  );
                  foreach (myclass s in w)
                    Console.Write(s.myname);
            }
       
            }

    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月8日 15:57
  • 给你写了一个完整的例子,你看看
    //学生类

         public class student
            {
                public int id;
                public string name;
            
            }

    //排序构造器
       public class studentSort : IComparer<student>
            {
          
                bool Desc = false;//True表示升序,FALSE表示降序
                public studentSort(bool desc)
                {
                    Desc = desc;
                }

                #region IComparer<student> 成员

                int IComparer<student>.Compare(student x, student y)
                {
                    if (Desc)
                    {


                        if (string.Compare(x.name, y.name) > 0)
                        {
                            return 1;
                        }
                        else if (string.Compare(x.name, y.name) == 0)
                        {
                            return 0;
                        }
                        else
                        {
                            return -1;
                        }
                    }
                    else
                    {

                        if (string.Compare(x.name, y.name) > 0)
                        {
                            return -1;
                        }
                        else if (string.Compare(x.name, y.name) == 0)
                        {
                            return 0;
                        }
                        else
                        {
                            return 1;
                        }
                   
                    }
                }

                #endregion
            }

    //按钮实现代码
           List<student>  ls=new List<student>();

            private void button1_Click(object sender, EventArgs e)
            {
                student s1 = new student();
                s1.id = 1;
                s1.name = "sB";
                ls.Add(s1);

                student s2=new student();
                s2.id=2;
                s2.name="sA";
                ls.Add(s2);
                studentSort ss=new studentSort(false);

                ls.Sort(ss);
                for (int i = 0; i < ls.Count; i++)
                   {
                   string aa=((student)ls[i]).name;
                    MessageBox.Show(aa);
                   }

            }


    努力+方法=成功
    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月9日 2:01

全部回复

  • 如果用3.0的话OrderBy方法 满足你的需求

    2009年12月8日 14:12
  •  楼上的... 是动态根据参数排序..   我现在用的就是VS2008 ... 


    学习者
    2009年12月8日 14:28
  • 你好!
         你可以自定义List<T>.Sort方法的比较器来实现,具体可以参考:
         http://msdn.microsoft.com/zh-cn/library/234b841s.aspx

    周雪峰
    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月8日 15:31
    版主
  • 写个简单的参考
      public class myclass
        {
           public  string  myname
            {
                get;
                set;
            }
     
        }
        class Program
        {
        

            static void Main(string[] args)
            {
                int[] i ={10,3,6,9,8,5,2,1,7,4,0};

                List<myclass> lm = new List<myclass>();
                foreach (int q in i)
                {
                    myclass mc = new myclass { myname="AA"+q.ToString()};
                    lm.Add(mc);
                }
     var w= lm.OrderByDescending(of => of.myname  ); 或者lm.OrderBy(of => of.myname  );
                  foreach (myclass s in w)
                    Console.Write(s.myname);
            }
       
            }

    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月8日 15:57
  • C# List排序一般用到的是继承IComparer<T>接口,实现int IComparer<T>.Compare(T t1, T t2)方法

    Student学生类
    //构造个比较器
    public class NameComparer:Icomparer<Student>
    {
       
    //实现姓名升序
        public int IComparer<Student >.Compare(Student x,Student y)
        {
           
    return(x.Name.CompareTo(y.Name));
        }
    }

    然后
    NameComparer sortGroup = new NameComparer();
    List<Student>.sort(NameComparer)


    努力+方法=成功
    2009年12月9日 1:08
  • 给你写了一个完整的例子,你看看
    //学生类

         public class student
            {
                public int id;
                public string name;
            
            }

    //排序构造器
       public class studentSort : IComparer<student>
            {
          
                bool Desc = false;//True表示升序,FALSE表示降序
                public studentSort(bool desc)
                {
                    Desc = desc;
                }

                #region IComparer<student> 成员

                int IComparer<student>.Compare(student x, student y)
                {
                    if (Desc)
                    {


                        if (string.Compare(x.name, y.name) > 0)
                        {
                            return 1;
                        }
                        else if (string.Compare(x.name, y.name) == 0)
                        {
                            return 0;
                        }
                        else
                        {
                            return -1;
                        }
                    }
                    else
                    {

                        if (string.Compare(x.name, y.name) > 0)
                        {
                            return -1;
                        }
                        else if (string.Compare(x.name, y.name) == 0)
                        {
                            return 0;
                        }
                        else
                        {
                            return 1;
                        }
                   
                    }
                }

                #endregion
            }

    //按钮实现代码
           List<student>  ls=new List<student>();

            private void button1_Click(object sender, EventArgs e)
            {
                student s1 = new student();
                s1.id = 1;
                s1.name = "sB";
                ls.Add(s1);

                student s2=new student();
                s2.id=2;
                s2.name="sA";
                ls.Add(s2);
                studentSort ss=new studentSort(false);

                ls.Sort(ss);
                for (int i = 0; i < ls.Count; i++)
                   {
                   string aa=((student)ls[i]).name;
                    MessageBox.Show(aa);
                   }

            }


    努力+方法=成功
    • 已标记为答案 KeFang Chen 2009年12月10日 3:29
    2009年12月9日 2:01
  • 晕,居然没有一个人明白楼主问什么!

    楼主说的是动态排序,排序的参数是字符串!

    各们大侠拜托看清楚人家问什么再回答吧。

    我也期待知道答案。

    2010年3月23日 7:41