首先定义一个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;
}

IComparable 成员#region IComparable<Book> 成员
public int CompareTo(Book other)
return (BookName.CompareTo(other.BookName));
}
#endregion
}
}以下定自定义排序类PriceDownClass来实现IComparer
namespace ArrayListSort
...{
class PriceDownClass:IComparer<Book>
...{
IComparer 成员#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
...{

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[8] ...{ new 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中实现排序.
本文通过一个具体案例展示了如何在C#中使用自定义排序类对数组和ArrayList中的Book对象进行排序,包括按名称和价格排序的方法。
1240

被折叠的 条评论
为什么被折叠?



