前面,我們介紹過C#的泛型 可以讓我們自行設計泛型方法、類別來進行操作資料
在這裡,會說明C#預設提供的泛型集合類別(generic collection classes) 讓我們可以直接拿來使用於操作資料 這些類別主要都被包含在一個Class裡面,稱為系統集合泛型(System.Collections.Generic) 在這裡會介紹 List, Dictionary, Queue, Stack 集合類別
List 集合類別
List 集合類別 是C#預設提供的泛型集合類別(generic collection classes) 使用的方式和前面介紹類別泛型(Generics Class)時,所舉的例子很像
只要用 List<型別參數T>,不必宣告大小,就可以直接使用,
List<型別參數T> 變數名稱 = new List<型別參數T>();
常用的List集合泛型方法 (假設,變數名稱為 mylist)
方法 | 說明 | 用法 |
---|---|---|
Add | 增加一個元素 | mylist.Add(值) |
Insert | 在指定的位置插入元素 | mylist.Insert(index. 值) |
AddRange | 插入多個元素(array或list) | mylist.Addrange(array or list) |
InsertRange | 在指定的位置插入多個元素(array或list) | mylist.InsertRange(index, array or list) |
GetRange | 取得指定index範圍的元素 | mylist.GetRange(index1, index2) |
Clear | 清除所有元素 | mylist.Clear() |
Contains | 檢查元素是否存 | mylist.Contains(值) |
Count | 元素數量 | mylist.Count() |
Reverse | 反轉元素排序 | mylist.Reverse() |
(完整list方法可以參考官方文件) |
範例:
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
List<int> colors = new List<int>();
colors.Add(1);
colors.Add(3);
colors.Add(2);
colors.Add(6);
foreach (var color in colors)
{
Console.WriteLine(color);
}
}
}
}
透過 AddRange 新增多個元素(來自Array) 範例
static void Main(string[] args)
{
//建立Array
int[] myary = new int[] {1,2,2,3,4,4,7,9 };
//建立List
List<int> colors = new List<int>();
colors.Add(1);
//List新增多個元素(來自myary)
colors.AddRange(myary);
//輸出List
foreach (var color in colors)
{
Console.WriteLine(color);
}
}
透過 AddRange 新增多個List元素 並且用 GetRange 取得 index 2~4 的元素 範例:
static void Main(string[] args)
{
//建立mylist List
List<int> mylist = new List<int>();
mylist.Add(2);
mylist.Add(6);
mylist.Add(7);
mylist.Add(4);
mylist.Add(3);
mylist.Add(3);
mylist.Add(7);
mylist.Add(4);
//建立List
List<int> colors = new List<int>();
colors.Add(1);
//List新增多個元素(來自mylist)
colors.AddRange(mylist);
//只取出index 2~4
int[] output = colors.GetRange(2, 4).ToArray();
//輸出List
foreach (var color in output)
{
Console.WriteLine(color);
}
}
透過list建立物件資料
在list中存取物件資料,就可以透過物件成員,讓資料格式更容易理解 這裡以學生資料為例 建立Student Class,包含成員 Name, Sexual, ID 在List中,則透過Student Class來建立資料 範例 ```c# using System; using System.Collections.Generic;namespace ConsoleApplication2 { class Program { public class Student { public string Name { get; set; } public int Sexual { get; set; } public int ID { get; set; } }
public static List<Student> GetStudents()
{
List<Student> students = new List<Student>
{
new Student {Name="Adam", Sexual=1, ID=1055010001},
new Student {Name="Steven", Sexual=2, ID=1055010002},
new Student {Name="Brown", Sexual=1, ID=1055010003},
new Student {Name="Cindy", Sexual=2, ID=1055010004},
new Student {Name="Tom", Sexual=1, ID=1055010005}
};
return students;
}
static void Main(string[] args)
{
List<Student> students = GetStudents();
foreach (var i in students)
{
string sex = i.Sexual == 1 ? "male" : "female";
Console.WriteLine("Name:" + i.Name + ", Sexual:" + sex + ", ID:" + i.ID);
}
}
}
}
## Dictionary 集合類別
記得在需要翻字典的年代,打開字典後,都會從關鍵字(部首、拼音...)開始找,接著才會知道要查詢的內容在哪頁。
而 C# 的 Dictionary集合類別的功能就和字典一樣,可以透過建立好的關鍵字(key),來取得對應的值(value)
Dictionary <TKey, TValue>;
使用Dictionary的key及value時,有一些地方要留意:
1. key不能重複,要具有唯一性。
2. key對應的value可以重複
3. key與value 型別不必相同
Dictionary<k型別, v型別> 變數名稱 = new Dictionary<k型別, v型別>();
並且有下列方法可以使用
**常用的 Dictionary 方法**
(假設,變數名稱為 myDict)
| **方法** | **說明** | **用法** |
| ------------ | :----------- | :----------- |
| Add | 增加一筆資料 | myDict.Add(key, value) |
| ContainsKey | 檢查key是否存在 | myDict.ContainsKey(key) |
| ContainsValue | 檢查value是否存在 | myDict.ContainsValue(value) |
| Count | 建立的資料筆數 | myDict.Count |
| Remove | 移除屬於該筆key的資料 | myDict.Remove(key) |
| TryGetValue | 透過key取得value | myDict.TryGetValue(key值, out 變數2) |
完整的Dictionary 方法可以參考[官方文件](https://msdn.microsoft.com/zh-tw/library/xfhwa508(v=vs.110).aspx)
**Dictionary透過key取得value的方式**
可以透過下面的方式來取得value
```c#
//方法一
string x;
變數名稱.TryGetValue(key值, out x);
//方法二
變數名稱[key值]
例如,建立一個 Dictionary ,key = 學號、 value=姓名,並且找出學號 1055010001 的人 範例:
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, string> MyDictionary = new Dictionary<int, string>();
MyDictionary.Add(1055010001, "Adam");
MyDictionary.Add(1055010002, "John");
MyDictionary.Add(1055010003, "Susan");
MyDictionary.Add(1055010004, "Mary");
//方法一
string x;
MyDictionary.TryGetValue(1055010001, out x);
Console.WriteLine(x);
//方法二
Console.WriteLine(MyDictionary[1055010001]);
}
}
}
另外,也可以直接用下列方式給予初始值
static void Main(string[] args)
{
Dictionary<int, string> MyDictionary = new Dictionary<int, string>(){
{ 1055010001, "Adam" },
{ 1055010002, "John" },
{ 1055010003, "Susan" },
{ 1055010004, "Mary" },
};
Console.WriteLine(MyDictionary[1055010001]);
}
Foreach - 搭配KeyValuePair取得key value Dictionary也可以透過foreach迴圈+KeyValuePair, 將資料(包含key value)一筆一筆取出來
KeyValuePair<TKey, TValue>
範例:
static void Main(string[] args)
{
Dictionary<int, string> MyDictionary = new Dictionary<int, string>(){
{ 1055010001, "Adam" },
{ 1055010002, "John" },
{ 1055010003, "Susan" },
{ 1055010004, "Mary" },
};
foreach(KeyValuePair<int, string> row in MyDictionary)
{
Console.WriteLine("Key="+row.Key+", Value="+row.Value);
}
}