方法二
4.4.4 對List<T>進行排序
List<T>作為列表,排序也是它的一個基本功能。List<T>可以通過Sort()對列表中的元素進行從小到大排序,同時Sort()還接收自定義比較器,這樣開發人員可以根據需要指定希望的比較方式。Sort()方法的3個常用版本的定義如下:
public void Sort();
public void Sort(IComparer<T> comparer);
public void Sort(int index,int count,IComparer<T> comparer);
其中,第1個版本是通過默認的比較器對列表中所有元素進行從小到大排序,如果類型T沒有默認比較器,也沒有實現接口IComparer<T>,即T不能進行比較,那麼會產生異常。參數comparer是一個實現了IComparer<T>接口的類型對象,Sort()通過comparer接口的Compare()對元素進行比較。第3個版本是部分元素進行比較,index表示起始索引(0開始計數),count表示要排序的元素個數。
IComparer<T>接口只有一個成員Compare(T x, T y),通常情況下,如果x小於y返回負數,x等於y返回0,x大於y返回整數。如示例代碼4-10中的MyIntComparer類,該類實現接口IComparer<int>,成員Compare(int x, int y)根據x和y的絕對值x和y進行比較。
示例代碼4-10演示Sort()方法和IComparer<T>的使用,泛型方法PrintList<T>()用來打印列表中的元素,該函數在後面的例子中會繼續使用。在UseSort()方法中,ary是最原始的數據,首先,用默認的比較器對元素按照從小到大排序(負數小於整數)。然後,用自定義整數比較器MyIntComparer對象mic對列表中的元素按照絕對值排序。最後,用mic對列表中第2個開始的3個元素按照絕對值排序。
示例代碼4-10
//自定義整數比較器,按照整數的絕對值進行比較
class MyIntComparer:IComparer<int>
{
//重寫int比較器,|x|>|y|返回正數,|x|=|y|返回0,|x|<|y|返回負數
public int Compare(int x, int y)
{
int x1 = Math.Abs(x); //x的絕對值x1
int y1 = Math.Abs(y); //y的絕對值y1
return x1 - y1;
}
}
//在同一行上打印列表中的元素
static void PrintList<T>(string hint, List<T> lst)
{
System.Console.Write(hint + ":");
foreach (T val in lst)
//遍歷並打印列表中的元素
{
System.Console.Write("{0} ", val);
}
System.Console.WriteLine();
}
static void UseSort()
{
int[] ary = {9, 8, -11, 10, -3, 2}; //準備
數據,添加到列表中
MyIntComparer mic = new MyIntComparer();
List<int> intLst = new List<int>( );
intLst.AddRange(ary);
//將數據添加到List<int>中
PrintList<int>("排序前", intLst); //打印數據
intLst.Sort( ); //使
用默認比較器進行排序
PrintList<int>("默認排序後", intLst); //打印數據
intLst.Clear( ); //重新準備數據
intLst.AddRange(ary);
intLst.Sort(mic); //用自定義
的比較器進行排序,即按絕對值排序
PrintList<int>("絕對值排序後", intLst); //打印數據
intLst.Clear( ); //重新準備數據
intLst.AddRange(ary);
intLst.Sort(2, 3, mic); //對第2個開始的3
個元素按絕對值排序
PrintList<int>("部分排序後", intLst); //打印數據
}
示例代碼4-10的輸出如下,默認排序之後元素按照從小到大排序,負數小於0和整數。按絕對排序之後,-3大於2,可見MyIntComparer起作用了。同樣部分排序的時候,第0和1兩個元素和最後一個元素都沒有參與排序。
排序前:9 8 -11 10 -3 2
默認排序後:-11 -3 2 8 9 10
絕對值排序後:2 -3 8 9 10 -11
部分排序後:9 8 -3 10 -11 2
技巧:如果希望對元素從大到小排序,可以先用Sort()方法對元素從小到大排序,然後再用Reverse()將列表中的元素倒置,就變成從大到小排序。
///////////////////////////////////////////////////////////////////////////////////////////
方法一
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Adapter_Server
{
public partial class test : Form
{
public test()
{
InitializeComponent();
}
private void test_Load(object sender, EventArgs e)
{
List<Book> list = new List<Book>();
Book b1, b2, b3, b4;
b2 = new Book("《鹿鼎記》", "金庸", "人民文學出版社", 120);
b1 = new Book("《絕代雙驕》", "古龍", "中國長安出版社", 50);
b3 = new Book("《三國演義》", "羅貫中", "中州古籍出版社", 200);
b4 = new Book("《西遊記》", "吳承恩", "晨光出版社", 80);
list.Add(b1);
list.Add(b2);
list.Add(b3);
list.Add(b4);
////按書名升序
//Debug.Print("/////////////按書名升序/////////////");
//list.Sort(new Icp());
//foreach (Book book in list)
//{
// Debug.Print(book.Name + book.Author + book.Publisher + book.Price);
//}
//Debug.Print("////////////////////////////////////");
//按價格降序序
Debug.Print("/////////////按價格升序/////////////");
list.Sort(new IcpPrice());
foreach (Book book in list)
{
Debug.Print(book.Name + book.Author + book.Publisher + book.Price);
}
Debug.Print("////////////////////////////////////");
Console.Read();
}
}
//比較器類
public class Icp : IComparer<Book>
{
//按書名排序
public int Compare(Book x, Book y)
{
return x.Name.CompareTo(y.Name);
}
}
public class IcpPrice : IComparer<Book>
{
//按價格排序
public int Compare(Book x, Book y)
{
return x.Price.CompareTo(y.Price);
}
}
public class Book
{
public Book(string inname, string inauthor, string inpublisher, int inprice)
{
this.Name = inname;
this.Author = inauthor;
this.Publisher = inpublisher;
this.Price = inprice;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string author;
public string Author
{
get { return author; }
set { author = value; }
}
private string publisher;
public string Publisher
{
get { return publisher; }
set { publisher = value; }
}
private int price;
public int Price
{
get { return price; }
set { price = value; }
}
}
}
留言列表