iT邦幫忙

2

如何排序自訂結構Array與List

小知識分享了..
C#中Array.Sort 方法主要是透過實作Array 或List中每個元素的 IComparable,快速的排序整個一維 Array 中的元素,避免傳統利用迴圈實作資料排序耗費的時間,也可以使程式碼更精簡。
使用範例如下:
public void SortDemo()
{
Random rand = new Random();
List<int> datas = new List<int>();
for (int i = 0; i < 100; i++)
{
datas.Add(rand.Next(1000));
}
datas.Sort();
}

但是針對某些特定的用途, 我們時常有自訂類別的需要。不過如果我們把自訂類別加入到陣列之中時, 我們要怎麼讓這個陣列可以排序呢? 舉個例子, 我訂了一個 classes 自訂類別:
**public class Data
{
public int Number;
public String Name;

public Data(int num, string name)
{
this.Number = num;
this.Name = name;
}
}**
然後, 我在List中加上了許多實體物件。但是我突然覺得我需要讓List依照Number來排序, 該怎麼做?
static void Run()
{
Random rand = new Random();
List<Data> datas = new List<Data>();
for (int i = 0; i < 100; i++)
{
Data data = new Data(rand.Next(100),rand.Next().ToString());
datas.Add(data);
}
datas.Sort();
}

你或許會發現有 Array.Sort 方法可以選擇,但是直接使用Sort排序會產生錯誤如下:

當然, 因為你還必須在自訂類別中加上一些東西。關鍵點在於,你必須在這個自訂類別中實做 IComparable介面,才能夠提供陣列及集合結構的排序功能。這個介面可以說是最容易實做的介面之一了, 因為你只需要在這個自訂類別中加上一個 CompareTo方法即可,範例如下:,
**public class Data : IComparable
{
public int Number;
public String Name;

public Data(int num, string name)
{
this.Number = num;
this.Name = name;
}

public int CompareTo(object obj)
{
Data tobeCompared = (Data)obj;
if (this.Number > tobeCompared.Number)
return 1;
else if (this.Number == tobeCompared.Number)
return 0;
else return -1;
}
}**
實作IComparable介面之後就可以進行排序了。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言