天天看點

用IComparable來實作可排序的集合

作者:Mahesh Chand 

原文位址:http://www.c-sharpcorner.com/UploadFile/mahesh/SortableArrays10212005115603AM/SortableArrays.aspx?ArticleID=d374d179-08e9-4473-b7e4-1991fad8affa

.NET Framework類庫中提供了幾個支援在集合中有追加功能的接口,比如:ICollection,IList和IComparable。 

實作 IComparable

IComparable接口用來支援在集合中排序。它有一個函數——CompareTo。當你設計分類對象時,你必須實作IComparable的CompareTo方法。

比如,我做一個Developer類來繼承IComparable。

用IComparable來實作可排序的集合

public   class  Developer : IComparable

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

}

現在我來實作ComparaTo方法如下:

用IComparable來實作可排序的集合

public   int  CompareTo( object  obj)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

// Some code here

用IComparable來實作可排序的集合

}

現在我們說,Developer類有一個屬性叫ID,而你希望你的這些項目按照ID來排序,我們簡單的加入如下代碼:

用IComparable來實作可排序的集合

public   int  CompareTo( object  obj)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      if( !(obj is Developer) )

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

            throw new InvalidCastException("Not a valid Developer object.");

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      Developer developer = (Developer)obj; 

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      return this.ID.CompareTo(developer.ID);                              

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

}

正如你所看到的上面的代碼,它來比較目前對象的值和新值作比較。

現在我們說,Developer對象還有其他公有屬性:FirstName,LastName,Age以及Experience,并且你想用它們中的任意一個來分類。

為了做到這點,我們定義一個枚舉:

用IComparable來實作可排序的集合

public   enum  SortFilter

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      FirstName,

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      LastName,

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      Age,

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      Experience

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

}

然後,我在Developer類中加入一個靜态屬性SortFilter:

用IComparable來實作可排序的集合

private   static  SortFilter sortingBy  =  SortFilter.FirstName; 

用IComparable來實作可排序的集合

public   static  SortFilter SortingBy

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      get 

用IComparable來實作可排序的集合

{ return sortingBy; }

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      set 

用IComparable來實作可排序的集合

{ sortingBy = value; }

用IComparable來實作可排序的集合

}

現在我修改ComparaTo方法如下:

用IComparable來實作可排序的集合

public   int  CompareTo( object  obj)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

      if( !(obj is Developer) )

用IComparable來實作可排序的集合

            throw new InvalidCastException("Not a valid Developer object.");

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      Developer developer = (Developer)obj; 

用IComparable來實作可排序的集合

      switch(Developer.SortingBy)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

            case SortFilter.FirstName: 

用IComparable來實作可排序的集合

                return this.FirstName.CompareTo(developer.FirstName);

用IComparable來實作可排序的集合

            case SortFilter.LastName: 

用IComparable來實作可排序的集合

                return this.LastName.CompareTo(developer.LastName);

用IComparable來實作可排序的集合

            case SortFilter.Age: 

用IComparable來實作可排序的集合

                return this.Age.CompareTo(developer.Age);

用IComparable來實作可排序的集合

            case SortFilter.Experience:

用IComparable來實作可排序的集合

                return this.Experience.CompareTo(developer.Experience);

用IComparable來實作可排序的集合

            default:

用IComparable來實作可排序的集合

                  goto case SortFilter.FirstName;

用IComparable來實作可排序的集合

      }

用IComparable來實作可排序的集合

}

用IComparable來實作可排序的集合

正如你所看到的上面的代碼,我為每一個分類條件加入一個case語句。現在我的類準備好了支援排序。所有我做的工作是:建立一個Developer對象的ArrayList,設定分類過濾器(SortFilter),調用Sort方法。

下面的代碼生成一個Developer類型的ArrayList:

用IComparable來實作可排序的集合

private  ArrayList GetList()

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

      ArrayList list = new ArrayList();

用IComparable來實作可排序的集合

      list.Add(new Developer("Mahesh", "Chand", 30, "C#,ASP.NET,Windows Forms", 10)) ; 

用IComparable來實作可排序的集合

      list.Add(new Developer("Michael", "Gold", 35, "GDI+, ASP.NET", 15)) ; 

用IComparable來實作可排序的集合

      list.Add(new Developer("Bhasker", "Das", 26, "VB.NET, Web Applications", 4)) ; 

用IComparable來實作可排序的集合

      list.Add(new Developer("Ashish", "Singhal", 24, "ADO.NET, GDI+", 4)) ; 

用IComparable來實作可排序的集合

      list.Add(new Developer("Neel", "Beniwal", 3, "C#,ASP.NET,Windows Forms", 0)) ; 

用IComparable來實作可排序的集合

      list.Add(new Developer("Melanie", "Talmadge", 25, "Java", 2)) ; 

用IComparable來實作可排序的集合

      return list;

用IComparable來實作可排序的集合

}

用IComparable來實作可排序的集合

下面的代碼設定以"FirstName"來分類,調用ArrayList的Sort方法。現在ArrayList将傳回分類結果。

用IComparable來實作可排序的集合

ArrayList list  =  GetList();

用IComparable來實作可排序的集合

Developer.SortingBy  =  (SortFilter)Enum.Parse( typeof (SortFilter),  " FirstName " );

用IComparable來實作可排序的集合

list.Sort();

排序順序

現在你可能還要在你的對象中加入排序的順序(升序還是降序)。為了完成這個,我加入一個SortOrder枚舉:

用IComparable來實作可排序的集合

public   enum  SortOrder

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

      Ascending,

用IComparable來實作可排序的集合

      Descending

用IComparable來實作可排序的集合

}

我也在Developer類中加入靜态屬性SortingOrder如下:

用IComparable來實作可排序的集合

private   static  SortOrder sortingOrder  =  SortOrder.Ascending;

用IComparable來實作可排序的集合

public   static  SortOrder SortingOrder

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      get 

用IComparable來實作可排序的集合

{ return sortingOrder; }

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

      set 

用IComparable來實作可排序的集合

{ sortingOrder = value; }

用IComparable來實作可排序的集合

}

我将CompareTo方法改成如下。正如你從這個函數中看到,現在我來檢測SortingOrder是Ascending還是Descending來根據要排序的屬性排序。

用IComparable來實作可排序的集合

public   int  CompareTo( object  obj)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

      if( !(obj is Developer) )

用IComparable來實作可排序的集合

            throw new InvalidCastException("Not a valid Developer object."); 

用IComparable來實作可排序的集合

      Developer developer = (Developer)obj; 

用IComparable來實作可排序的集合

      switch(Developer.SortingBy)

用IComparable來實作可排序的集合
用IComparable來實作可排序的集合
用IComparable來實作可排序的集合

{

用IComparable來實作可排序的集合

            case SortFilter.FirstName: 

用IComparable來實作可排序的集合

                  if (Developer.sortingOrder == SortOrder.Ascending)

用IComparable來實作可排序的集合

                      return this.FirstName.CompareTo(developer.FirstName);

用IComparable來實作可排序的集合

                  else return developer.FirstName.CompareTo(this.FirstName);

用IComparable來實作可排序的集合

            case SortFilter.LastName: 

用IComparable來實作可排序的集合

                  if (Developer.sortingOrder == SortOrder.Ascending)

用IComparable來實作可排序的集合

                        return this.LastName.CompareTo(developer.LastName);

用IComparable來實作可排序的集合

                  else return developer.LastName.CompareTo(this.LastName);

用IComparable來實作可排序的集合

            case SortFilter.Age: 

用IComparable來實作可排序的集合

                  if (Developer.sortingOrder == SortOrder.Ascending)

用IComparable來實作可排序的集合

                        return this.Age.CompareTo(developer.Age);

用IComparable來實作可排序的集合

                  else return developer.Age.CompareTo(this.Age);

用IComparable來實作可排序的集合

            case SortFilter.Experience:

用IComparable來實作可排序的集合

                  if (Developer.sortingOrder == SortOrder.Ascending)

用IComparable來實作可排序的集合

                        return this.Experience.CompareTo(developer.Experience);

用IComparable來實作可排序的集合

                  else return developer.Experience.CompareTo(this.Experience);

用IComparable來實作可排序的集合

            default:

用IComparable來實作可排序的集合

                  goto case SortFilter.FirstName;

用IComparable來實作可排序的集合

      }

用IComparable來實作可排序的集合

}

現在需要做的就是,将SortingOrder屬性加入Developer對象中,調用Sort函數。

用IComparable來實作可排序的集合

Developer.SortingOrder  =  (SortOrder)Enum.Parse( typeof (SortOrder),  " Descending " );

用IComparable來實作可排序的集合

list.Sort();

用IComparable來實作可排序的集合

原文頁面有代碼下載下傳。

轉載于:https://www.cnblogs.com/c-delight/archive/2005/12/28/306621.html