前面,我們介紹過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);
    }
}