C# Collection and Generics

了解 C# 的集合和泛型有助於你處理資料該有的型態

(KJH) Kuan-Jung, Huang
4 min readDec 25, 2023
Image Powered by DALLE

甚麼是集合(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 的界限。我們通常使用 foreachfor 循環來讀取 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# 的集合和泛型有助於你處理資料該有的型態。

--

--

(KJH) Kuan-Jung, Huang
(KJH) Kuan-Jung, Huang

Written by (KJH) Kuan-Jung, Huang

CTO at Metablox.co, Founder of AI Users Community in Taiwan

No responses yet