熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#數組排序與對象大小比較

2013-11-13 09:42:06  來源: .NET編程 
        我們將介紹C#數組排序與對象大小比較包括一些實例代碼以及IComparableIComparable和IComparer三大接口的用法

  從個小例子開始

  int[] intArray = new int[]{}ArraySort(intArray)ArrayForEach<int>(intArray(i)=>ConsoleWriteLine(i))這個例子定義了一個int數組然後使用ArraySort(arr)靜態方法對此數組進行排序最後輸出排序後的數組以上例子將毫無意外的依次輸出

  為什麼Array的Sort方法可以正確的對int數組進行排序呢我們自定義類可以嗎?試試看如下代碼

  public class Student { public int Age { get set } public string Name { get set } public int Score { get set } } static void Main(string[] args)

  { Student[] students = new Student[]{ new Student(){Age = Name=張三Score=}new Student(){Age = Name=李四Score=}new Student(){Age = Name=王五Score=}new Student(){Age = Name=趙六Score=}new Student(){Age = Name=司馬Score=}}ConsoleWriteLine(——默認排序輸出——ArraySort(students)ArrayForEach<Student>(students(s)=>ConsoleWriteLine(stringFormat({}{}歲了他的分數是{}sNamesAgesScore)))ConsoleRead()}我們定義了Student類然後同樣對他的數組進行排序程序正確的編譯通過但是運行出錯運行時拋出了異常SystemInvalidOperationException{Failed to compare two elements in the array}這個異常的InnerException是ArgumentException{At least one object must implement IComparable}運行時異常說明我們要使用ArraySort(arr)靜態方法必須得保證數組中有一個元素實現IComparable接口既然如此我們就讓Student類實現IComparable接口

  public class Student IComparable { public int Age { get set } public string Name { get set } public int Score { get set } /// <summary> /// 實現IComparable接口用Age做比較/// </summary> /// <param name=obj>比較對象</param> /// <returns>比較結果</returns> public int CompareTo(object obj)

  { if (obj is Student)

  { return AgeCompareTo(((Student)obj)Age)} return }在Student類中實現了IComparable接口在CompareTo方法中比較Student的Age屬性這一次再次編譯運行程序正常的輸出了按照年齡排序的Student數組

  假如說我們要對Student的Score屬性進行排序該怎麼辦呢? Student類實現的IComparable接口只能按照一種屬性排序呀

  這個是很容易實現的net的類庫開發者早為我們准備了另一個接口IComparer<T>接口用來實現比較類型T的兩個實例如下StudentScoreComparer類實現了對Student按照Score屬性比較的IComparer<Student>

  public class StudentScoreComparer IComparer<Student> { public int Compare(Student x Student y)

  { return xScoreCompareTo(yScore)}現在我們可以使用下面代碼對Student數組按照Score屬性進行排序

  ConsoleWriteLine(——按分數排序輸出——

  ArraySort(students new StudentScoreComparer())

  ArrayForEach<Student>(students (s) => ConsoleWriteLine(stringFormat({}{}歲了他的分數是{} sName sAge sScore)))

  不過一個簡單的按照Score屬性排序再定義一個類是不是有點大題小作呀有沒有更好的辦法呢?當然有為我們准備了比較對象大小的委托Comparison<T>我們可以使用拉姆達表達式或者匿名委托直接排序如下代碼實現

  ConsoleWriteLine(——按分數排序輸出——ArraySort(students (s s) => sScoreCompareTo(sScore))ArrayForEach<Student>(students (s) => ConsoleWriteLine(stringFormat({}{}歲了他的分數是{} sName sAge sScore)))完整代碼示例如下

  using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemTextnamespace SortingInCSharp { class Program { public class Student IComparable { public int Age { get set } public string Name { get set } public int Score { get set } /// <summary> /// 實現IComparable接口用Age做比較/// </summary> /// <param name=obj>比較對象</param> /// <returns>比較結果</returns> public int CompareTo(object obj)

  { if (obj is Student)

  { return AgeCompareTo(((Student)obj)Age)} return } static void Main(string[] args)

  { Student[] students = new Student[]{ new Student(){Age = Name=張三Score=}new Student(){Age = Name=李四Score=}new Student(){Age = Name=王五Score=}new Student(){Age = Name=趙六Score=}new Student(){Age = Name=司馬Score=}}ConsoleWriteLine(——默認排序輸出——ArraySort(students)ArrayForEach<Student>(students (s) => ConsoleWriteLine(stringFormat({}{}歲了他的分數是{} sName sAge sScore)))ConsoleWriteLine(——按分數排序輸出——ArraySort(students new StudentScoreComparer())ArrayForEach<Student>(students (s) => ConsoleWriteLine(stringFormat({}{}歲了他的分數是{} sName sAge sScore)))ConsoleWriteLine(——按分數排序輸出——ArraySort(students (s s) => sScoreCompareTo(sScore))ArrayForEach<Student>(students (s) => ConsoleWriteLine(stringFormat({}{}歲了他的分數是{} sName sAge sScore)))ConsoleRead()} public class StudentScoreComparer IComparer<Student> { public int Compare(Student x Student y)

  { return xScoreCompareTo(yScore)}總結

  在C#中有三個關於比較對象大小的接口分別是IComparableIComparable<T>和IComparer<T> IComparable和IComparable<T>是類本身實現的在實例之間比較大小的行為定義IComparer<T>是定義在被比較類之外的專門比較兩個T類型對象大小的行為另外還有一個用於比較的委托定義Comparison<T>可以讓我們用拉姆達表達式或者匿名委托或方法更方便的排序


From:http://tw.wingwit.com/Article/program/net/201311/11369.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.