程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎之數組排序,對象大小比較

C#基礎之數組排序,對象大小比較

編輯:C#入門知識

從個小例子開始:

view sourceprint?1 int[] intArray = new int[]{2,3,6,1,4,5}; 

2 Array.Sort(intArray); 

3 Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i));

這個例子定義了一個int數組,然後使用Array.Sort(arr)靜態方法對此數組進行排序,最後輸出排序後的數組。以上例子將毫無意外的依次輸出1,2,3,4,5,6.

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

view sourceprint?01 public class Student  

02 { 

03     public int Age { get; set; } 

04   

05     public string Name { get; set; } 

06   

07     public int Score { get; set; } 

08 } 

09   

10   

11   

12 static void Main(string[] args) 

13 { 

14     Student[] students = new Student[]{ 

15         new Student(){Age = 10,Name="張三",Score=70}, 

16         new Student(){Age = 12,Name="李四",Score=97}, 

17         new Student(){Age = 11,Name="王五",Score=80}, 

18         new Student(){Age = 9,Name="趙六",Score=66}, 

19         new Student(){Age = 12,Name="司馬",Score=90}, 

20     }; 

21   

22     Console.WriteLine("--------------默認排序輸出--------"); 

23     Array.Sort(students); 

24     Array.ForEach<Student>(students,(s)=>Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}",s.Name,s.Age,s.Score))); 

25   

26     Console.Read(); 

27 }

我們定義了Student類然後同樣對他的數組進行排序,程序正確的編譯通過,但是運行出錯,運行時拋出了異常:System.InvalidOperationException{"Failed to compare two elements in the array."},這個異常的InnerException是ArgumentException{"At least one object must implement IComparable."};運行時異常說明:我們要使用Array.Sort(arr)靜態方法,必須得保證數組中有一個元素實現IComparable接口。既然如此我們就讓Student類實現IComparable接口.

view sourceprint?01 public class Student :IComparable 

02 { 

03     public int Age { get; set; } 

04   

05     public string Name { get; set; } 

06   

07     public int Score { get; set; } 

08   

09   

10     /// <summary> 

11     /// 實現IComparable接口,用Age做比較 

12     /// </summary> 

13     /// <param name="obj">比較對象</param> 

14     /// <returns>比較結果</returns> 

15     public int CompareTo(object obj) 

16     { 

17         if (obj is Student) 

18         { 

19            return Age.CompareTo(((Student)obj).Age); 

20         } 

21   

22         return 1; 

23     } 

24 }

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

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

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

view sourceprint?1 public class StudentScoreComparer : IComparer<Student> 

2 { 

3     public int Compare(Student x, Student y) 

4     { 

5         return x.Score.CompareTo(y.Score); 

6     } 

7 }

現在我們可以使用下面代碼對Student數組按照Score屬性進行排序:

view sourceprint?1 Console.WriteLine("----------按分數排序輸出------------"); 

2 Array.Sort(students, new StudentScoreComparer()); 

3 Array.ForEach<Student>(students, (s) => Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}", s.Name, s.Age, s.Score)));

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

view sourceprint?1 Console.WriteLine("----------按分數排序輸出----------"); 

2 Array.Sort(students, (s1, s2) => s1.Score.CompareTo(s2.Score)); 

3 Array.ForEach<Student>(students, (s) => Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}", s.Name, s.Age, s.Score)));

完整代碼示例如下:

show sourceview sourceprint?01 using System; 

02 using System.Collections.Generic; 

03 using System.Linq; 

04 using System.Text; 

05   

06 namespace SortingInCSharp 

07 { 

08     class Program 

09     { 

10         public class Student : IComparable 

11         { 

12             public int Age { get; set; } 

13   

14             public string Name { get; set; } 

15   

16             public int Score { get; set; } 

17   

18             /// <summary> 

19             /// 實現IComparable接口,用Age做比較 

20             /// </summary> 

21             /// <param name="obj">比較對象</param> 

22             /// <returns>比較結果</returns> 

23             public int CompareTo(object obj) 

24             { 

25                 if (obj is Student) 

26                 { 

27                     return Age.CompareTo(((Student)obj).Age); 

28                 } 

29   

30                 return 1; 

31             } 

32         } 

33   

34         static void Main(string[] args) 

35         { 

36             Student[] students = new Student[]{ 

37                 new Student(){Age = 10,Name="張三",Score=70}, 

38                 new Student(){Age = 12,Name="李四",Score=97}, 

39                 new Student(){Age = 11,Name="王五",Score=80}, 

40                 new Student(){Age = 9,Name="趙六",Score=66}, 

41                 new Student(){Age = 12,Name="司馬",Score=90}, 

42             }; 

43   

44             Console.WriteLine("--------------默認排序輸出--------"); 

45             Array.Sort(students); 

46             Array.ForEach<Student>(students, (s) => Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}", s.Name, s.Age, s.Score))); 

47   

48             Console.WriteLine("----------按分數排序輸出------------"); 

49             Array.Sort(students, new StudentScoreComparer()); 

50             Array.ForEach<Student>(students, (s) => Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}", s.Name, s.Age, s.Score))); 

51   

52             Console.WriteLine("----------按分數排序輸出----------"); 

53             Array.Sort(students, (s1, s2) => s1.Score.CompareTo(s2.Score)); 

54             Array.ForEach<Student>(students, (s) => Console.WriteLine(string.Format("{0}{1,2}歲了,他的分數是{2,3}", s.Name, s.Age, s.Score))); 

55   

56   

57             Console.Read(); 

58         } 

59   

60         public class StudentScoreComparer : IComparer<Student> 

61         { 

62             public int Compare(Student x, Student y) 

63             { 

64                 return x.Score.CompareTo(y.Score); 

65             } 

66         } 

67     } 

68 }

總結:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved