C# Collection and Generics
了解 C# 的集合和泛型有助於你處理資料該有的型態
甚麼是集合(Collection)
在 C# 裡,集合是一種非常核心的概念。我們可以利用集合設計簡單到複雜的資料結構。透過集合這樣的物件,我們可以很輕鬆的儲存和管理像是List<T>
和 Dictionary<TKey, TValue>
這兩種非常常見的集合類型。
Array&List
什麼時候用 Array?什麼時候用 List?
在任何語言中,Array 是最基本的數據結構之一,C# 也不例外。當你已經知道所需儲存資料的具體數量時,使用 Array 就會列是一個不錯的選擇。
我們一般透過 Collection Initializers 來初始化一個 Array:
string[] colorOptions = {"Red", "Blue", "Yellow", "Green" };
至於存取 Array 中的元素,通常要注意存取的資料是否超出 Array 的界限。我們通常使用 foreach
或 for
循環來讀取 Array 中的每個元素。 foreach
方便但不能修改 Array 中的值,要修改值的話必須透過 for
的語法。
我們可以使用 Array methods 來對 array 做操作:
//可以透過 Array.IndexOf 找出值的 index
var greenIndex = Array.IndexOf(colorOptions, "Green");
//可以透過 Array.SetValue 修改某 index 的內容
colorOptions.SetValue("Blue", 3);
甚麼是泛型(Generics)
泛型是 C# 中另一項強大的特性。透過泛型我們可以很彈性地定義物件的類型。也就是說我們不一開始指定具體的資料型別,而是在使用時才具體的指定資料型別。
最常見的泛型集合是List<T>
。其中的T
代表資料型別。List<T>
提供了一個很動態儲存空間的序列,可以存儲任何特定的資料型別。
下面是一段範例程式碼:
List<string> cities = new List<string>();
cities.Add("Taipei");
cities.Add("Kaohsiung");
cities.Add("Taichung");
//or
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers. Add(3);
在這個例子中,cities
這個列表專門用於儲存字串類型的資料,如果你在 cities
中加入字串以外的資料型別,編譯器就會報錯,避免了執行期的錯誤。
同樣地 numbers
列表專門用於儲存整數。你同時可以看到一個 List
居然可以同時儲存兩種資料型別的列表。這樣的威力在哪呢?我們接著看看 Method 運用泛型的範例:
public void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
int a = 10;
int b = 20;
Swap<int>(ref a, ref b);
string x = "Hello";
string y = "World";
Swap<string>(ref x, ref y);
這裡的 Swap<T>
方法可以用於任何資料型別。我們不用像 C 語言一樣重複寫一樣的函式只為了處理不同的資料型別。
如果你的程式是給別人用,但又擔心傳入的資料型別是程式不支援的,你可以運用泛型約束的概念來加以限制傳入的資料型別:
public interface IMyInterface { }
public class MyClass : IMyInterface { }
public void MyGenericMethod<T>(T myParam) where T : IMyInterface
{
// ...
}
在這個例子中,MyGenericMethod<T>
只能傳入 IMyInterface
類型的資料。
結論
了解 C# 的集合和泛型有助於你處理資料該有的型態。