none
关于List的Sort的疑问 RRS feed

  • 问题

  • 我有个类

    class Customer

    {

       public string code="":  //代号 如 BJ10110A ,BJ10111A ,BJ10110B, GZ10110A

       public string name=""; 

       public string sales="" //业务员 如Jonh ,Tomy, 

    }

    然后我用List 装载这些客户资料,我是想按业务员号排序一次,同一业务员内再按客户编号排,那么做法上是按客户编号sort一次,再按业务员sort一次

    于是使用

    list.Sort(delegate(Customer t1, Customer t2) { return t1.code.CompareTo(t2.code); });
     list.Sort(delegate(Customer t1, Customer t2) { return t1.sales.CompareTo(t2.sales); });

    第一句执行完毕后结果是按客户编码排没错,但第二句执行后,变成只是按照业务员排序,而在同一业务员下的客户编号顺序被打乱了,这是怎么回事啊?

     

     

    2011年6月23日 9:26

答案

  • 你好

    或者你可以嘗試以下方法

     List<Customer> a = new List<Customer>();

                List<Customer> b = a.OrderBy(x => x.sales).ThenBy(x => x.code).ToList();

    Please correct me if my concept is wrong


    Chi
    • 已标记为答案 scate233 2011年6月24日 1:45
    • 取消答案标记 scate233 2011年6月24日 1:45
    • 已标记为答案 scate233 2011年6月24日 1:45
    • 取消答案标记 scate233 2011年6月24日 2:08
    • 已标记为答案 scate233 2011年6月24日 9:29
    2011年6月23日 11:55
    版主
  • List<Customer> a = new List<Customer>();

    a=(from b in a 

        orderby a.code,a.sale

        select b).ToList();




    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".

    这个要LinkQ吧?我这边只能用2.0做
    • 已标记为答案 scate233 2011年6月24日 9:29
    2011年6月24日 6:15

全部回复

  • 你好

    或者你可以嘗試以下方法

     List<Customer> a = new List<Customer>();

                List<Customer> b = a.OrderBy(x => x.sales).ThenBy(x => x.code).ToList();

    Please correct me if my concept is wrong


    Chi
    • 已标记为答案 scate233 2011年6月24日 1:45
    • 取消答案标记 scate233 2011年6月24日 1:45
    • 已标记为答案 scate233 2011年6月24日 1:45
    • 取消答案标记 scate233 2011年6月24日 2:08
    • 已标记为答案 scate233 2011年6月24日 9:29
    2011年6月23日 11:55
    版主
  •  

    list.Sort(delegate (Customer t1, Customer t2) {
        int cp;
    
        // Sort by code first
        if ((cp == (t1.code.CompareTo(t2.code)) != 0) {
            return cp;
        }
    
        // Then sort by sales
        if ((cp == (t1.sales.CompareTo(t2.sales)) != 0) {
            return cp;
        }
    
        // Finally by names
        if ((cp == (t1.name.CompareTo(t2.name)) != 0) {
            return cp;
        }
    
        return 0;
    });
    • 已标记为答案 scate233 2011年6月24日 1:45
    • 取消答案标记 scate233 2011年6月24日 1:54
    • 已标记为答案 scate233 2011年6月24日 1:58
    • 取消答案标记 scate233 2011年6月24日 2:08
    2011年6月23日 22:34
  •  

    list.Sort(delegate (Customer t1, Customer t2) {
    
    
    
        int cp;
    
    
    
    
    
    
    
        // Sort by code first
    
    
    
        if ((cp == (t1.code.CompareTo(t2.code)) != 0) {
    
    
    
            return cp;
    
    
    
        }
    
    
    
    
    
    
    
        // Then sort by sales
    
    
    
        if ((cp == (t1.sales.CompareTo(t2.sales)) != 0) {
    
    
    
            return cp;
    
    
    
        }
    
    
    
    
    
    
    
        // Finally by names
    
    
    
        if ((cp == (t1.name.CompareTo(t2.name)) != 0) {
    
    
    
            return cp;
    
    
    
        }
    
    
    
    
    
    
    
        return 0;
    
    
    
    });

    我改造了下

                        int cp=0;

                        // Sort by code first
                       cp = t1.code.CompareTo(t2.code);
                        if (cp!=0  )
                        {
                            return cp;
                        }

                        // Then sort by sales
                        cp = t1.sales.CompareTo(t2.sales);
                        if (cp!=0 )
                        {
                            return cp;
                        }
    刚才试验了几次下,发现有时当code比较无序时,没法再按sales排序了,因为上面已经return了

    1楼那个要用到framwork3.0吧,我的是2.0


    2011年6月24日 2:07
  • list.Sort(delegate(Customer t1, Customer t2) { return (t1.code.PadRight(100)+t1.sales).CompareTo(t2.code.PadRight(100)+t2.sales); });

    http://feiyun0112.cnblogs.com/
    2011年6月24日 3:40
    版主
  • List<Customer> a = new List<Customer>();

    a=(from b in a 

        orderby a.code,a.sale

        select b).ToList();




    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".
    2011年6月24日 5:05
  • list.Sort(delegate(Customer t1, Customer t2) { return (t1.code.PadRight(100)+t1.sales).CompareTo(t2.code.PadRight(100)+t2.sales); });

    http://feiyun0112.cnblogs.com/


    这样也不行,如  BJ1001A --Anna  ; BJ1010A-- Anna ; BJ1003A--Billy

    执行后就会成为

    BJ1001A --Anna  ; 

     BJ1003A--Billy

    BJ1010A-- Anna

          

    2011年6月24日 6:14
  • List<Customer> a = new List<Customer>();

    a=(from b in a 

        orderby a.code,a.sale

        select b).ToList();




    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".

    这个要LinkQ吧?我这边只能用2.0做
    • 已标记为答案 scate233 2011年6月24日 9:29
    2011年6月24日 6:15
  • 下载了个第三方的dll,用linQ搞掂,
    2011年6月24日 9:29
  • 谢谢分享经验
    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月27日 5:21
    版主