Array和ArrayList的自定义排序问题

首先定义一个Book类:

namespace  ArrayListSort
{
    
class Book:IComparable<Book>
    
{
        
private string _bookname;
        
private string _bookcategory;
        
public double _price;

        
public string BookName
        
{
            
get return _bookname; }
            
set { _bookname = value; }
        }

        
public string BookCategory
        
{
            
get return _bookcategory; }
            
set { _bookcategory = value; }
        }

        
public double Price
        
{
            
get return _price; }
            
set { _price = value; }
        }


        
public Book(string bookname, string bookcategory, double price)
        
{
            _bookname 
= bookname;
            _bookcategory 
= bookcategory;
            _price 
= price;
        }


        
#region IComparable<Book> 成员

        
public int CompareTo(Book other)
        
{
            
return (BookName.CompareTo(other.BookName));
        }


        
#endregion

    }

}

以下定自定义排序类PriceDownClass来实现IComparer

 

namespace  ArrayListSort
{
    
class PriceDownClass:IComparer<Book>
    
{
        
#region IComparer<Book> 成员

        
public int Compare(Book x, Book y)

        
{
            
if (y.Price > x.Price)
                
return 1;
            
else if (y.Price == x.Price)
                
return 0;
            
else
                
return -1;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
#endregion

    }

}

以下定自定义排序类PriceDownClass来实现IComparer

 

namespace  ArrayListSort
{
    
class PriceCompare : IComparer
    
{

        
#region IComparer<Book> 成员

        
public int Compare(object x, object y)
        
{
            
double i = ((Book)y).Price - ((Book)x).Price;
           
// double i = y.Price - x.Price;

            
if ( i>0)

                
return 1;
            
else if (i==0)
                
return 0;
            
else
                
return -1;
        }


        
#endregion

    }

}

以下为整个程序的唯一入口:

 

namespace  ArrayListSort
{
    
class Program
    
{
        
static void Main(string[] args)
        
{

            Book[] books 
= new Book[8new Book("C#书籍z""C#"45.5), new Book("C#书籍f""C#"55.8) ,
                                         
new Book("Delphi书籍1","Delphi",78),new Book("C#书籍x""C#"55.9),
                                         
new Book("Asp.net""Asp.net"55.8),new Book("Delphi书籍2","Delphi",79),
                                         
new Book("C#书籍y""C#"60),new Book("C#书籍b""C#"80)
            }
;

            ArrayList a1 
= new ArrayList(books);//以books数组为参数构造ArrayList实例 a1;
            Console.WriteLine("Array_排序前的集合排列:");
            DisplayResult(books);
            Console.WriteLine();

            Array.Sort(books);
            Console.WriteLine(
"Array_按书籍名称排序后:");//Book类已经实现了IComparable接口
            DisplayResult(books);
            Console.WriteLine();

            Array.Sort(books, 
new PriceDownClass());
            Console.WriteLine(
"Array_按书籍价格降价排序后:");
            DisplayResult(books);
            Console.WriteLine();

            
//a1.Sort();//Book类已经实现了IComparable接口,但不能实现排序
            
//a1.Sort(new PriceDownClass());//Array情况下可以排序,不知为什么ArrayList情况下就不行了??
            /*
             更改自定义排序类 public int Compare(Book x, Book y) 改为 public int Compare(object x, object y)
             就可以了在ArrayList的自定义排序中应用,更改后的自定义排序类也可用天Array的Sort()方法 
             
*/

            a1.Sort(
new PriceCompare());
            Console.WriteLine(
"ArrayList_按书籍价格降价排序后:");
            DisplayResult(a1);
            Console.WriteLine();

            Array.Sort(books, 
new PriceCompare());//
            DisplayResult(books);
        }


        
static void DisplayResult(Book[] al) {
            
foreach (Book book in al)
            
{
                Console.WriteLine(
"书名:{0} 价格:{1} ", book.BookName, book.Price);
            }

        }


        
static void DisplayResult(ArrayList al)
        
{
            
foreach (Book book in al)
            
{
                Console.WriteLine(
"书名:{0} 价格:{1} ", book.BookName, book.Price);
            }

        }

    }

}

    Array和ArrayList在自定义排序类中的区别从上例中可以看出, 对于集合元素为引用类型时,类中实现了IComperable接口,在Array中可直接进行缺省排序Array.Sort(books),但a1.Sort() 不能实现排序;自定义排序类中实现泛型接口时如果确定IComparer<T>的T类型,则此自定义排序类不能用于ArrayList中实现排序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值