代碼閱讀總結之ASP.NET StartKit TimeTracker(自訂集合類排序(Sort())方法隨筆)

來源:互聯網
上載者:User

ASP.NET StartKit TimeTracker中定義了很多自訂集合類
例如:
UsersCollection
TimeEntriesCollection
等等

他們都是ArrayList類的子類

例如:
TimeEntriesCollection存放自訂類TimeEntry

這些自訂集合類都實現了排序方法Sort

先看我寫的一段代碼:

using System;
using System.Collections;

namespace ArrayListSort
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            ArrayList a=new ArrayList(8);
            a.Add(111);
            a.Add(2);
            
            a.Sort();

            IEnumerator iEnumerator=a.GetEnumerator();
            while( iEnumerator.MoveNext() )
            {
                Console.WriteLine(iEnumerator.Current.ToString() );
            }

            ArrayList b=new ArrayList(8);
            b.Add(new class2("wo"));
            b.Add( new class2("ai"));
            b.Add( new class2("i"));
            
            b.Sort();
            
            IEnumerator iiEnumerator=b.GetEnumerator();
            while( iiEnumerator.MoveNext() )
            {
                Console.WriteLine(((class2)iiEnumerator.Current).A );
            }

            Console.ReadLine();
        }
    }

    public class class2
    {

        public class2( string str)
        {
            this.a=str;
        }
        
        string a;

        public string A
        {
            get
            {
                return a;
            }
        }
        
    }


}

運行結果是

a的排序結果出來了
b的排序出現了錯誤

為什麼會出現這樣的結果?
ArrayList的Sort方法是利用了介面IComparable來進行的排序
這就是說ArrayList中的每個對象需要實現IComparable介面
int,string等系統已定義類型已經實現了IComparable介面
a.Sort()方法運行是正確的
b.Sort();由於沒有實現IComparable介面出現錯誤

現在修改class2代碼,程式就可以正確運行

public class class2:IComparable
    {

        public class2( string str)
        {
            this.a=str;
        }
        
        string a;

        public string A
        {
            get
            {
                return a;
            }
        }


        public int CompareTo(object o)
        {
            return this.A.CompareTo( ((class2)o).A ); 
        }
        
    }

其實還有一種方法實現排序
利用Sort(IComparer)
定義類實現介面System.Collections.IComparer
代碼如下:

public class class2_sort:System.Collections.IComparer
    {
        //是否為升序
        bool isAsc;
        
        //預設排序方式為升序
        public class2_sort()
        {
            isAsc=true;
        }

        public class2_sort(bool b)
        {
            isAsc=b;
        }

        public     int Compare(object x ,object y)
        {
            if (isAsc)
            {
                //升序
                return ((class2)x).A.CompareTo(((class2)y).A);
            }
            else
            {
                //降序
                return ((class2)y).A.CompareTo(((class2)x).A);
            }
        }
    }

b.Sort( new class2_sort(false));
就可以實現降循序排序

個人覺得此方法靈活性高
推薦使用

小總結:
1.若要對自己的對象的數組進行排序,請在該對象上實現 IComparable 介面。
必須在該對象中定義一個 CompareTo 方法,以指定比較該對象的方式。
2.若要定義比較對象的特定方式,請建立一個實現了 IComparer 介面的類。
在該類中,必須包含一個 Compare 方法,該方法可接受要比較的兩個對象。
它有助於您瞭解想要比較對象的方式以及允許哪些對象使用所定義的介面。

 

希望上面提到的知識對你有所提示
當然歡迎交流和指正

author:aierong
blog:http://www.cnblogs.com/aierong
email:aierong@126.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.