close

方法二


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; }
        }
    }
}




    


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 createps 的頭像
    createps

    遊戲人生 人生遊戲

    createps 發表在 痞客邦 留言(0) 人氣()