B站看寶蓮燈。人沉香正在那撕心裂肺地哭喊:“我要怎樣才能打敗我的舅舅?????!”
彈幕飄過一行字:你正月里剪個頭。

========================手動分割線==========================
一、集合
- 集合提供一種靈活的處理方法。
- 與數(shù)組不同,處理的對象組可根據(jù)程序更改的需要動態(tài)地增長和收縮。
- 對于某些集合,您可以為放入該集合的任何對象分配一個“鍵”,以便使用該鍵快速檢索對象。
- 注意:集合是類,因此必須聲明新集合后,才能向該集合中添加元素。
- 集合分類:非泛型集合和泛型集合
- 使用非泛型集合的需引入:System.Collections命名空間。
- 使用泛型集合需引入:System.Collections.Generic命名空間
1.1 System.Collections 命名空間下的集合類:
- ArrayList:表示大小根據(jù)需要動態(tài)增加的數(shù)組對象
- Hashtable:表示根據(jù)鍵的哈希代碼進(jìn)行組織的鍵/值對的集合
- Queue:隊列,表示對象先進(jìn)先出(FIFO)
- Stack:棧,表示對象后進(jìn)先出(LIFO)
1.2 System.Collections.Generic命名空間下的集合類:
- Dictionary<TKey, TValue>:表示根據(jù)鍵進(jìn)行組織的鍵/值對的集合。
- List<T>:表示課通過索引訪問的對象的列表,提供用于對列表進(jìn)行搜索、排序和修改的方法。
- Queue<T>:表示對象的先進(jìn)先出 (FIFO) 集合
- Stack<T>:表示對象的后進(jìn)先出 (LIFO) 集合
- SortedList<TKye,TValue>:表示根據(jù)鍵進(jìn)行排序的鍵/值對的集合,而鍵基于的是相關(guān)的IComparer<T>實現(xiàn)
- 創(chuàng)建數(shù)組,回顧之前的知識點:
int[] arr = new int[3]{ 1, 2, 3 };
// 遍歷數(shù)組
foreach (int temp in arr) {
Console.WriteLine (temp);
}
- 數(shù)組的缺點:數(shù)組初始化以后,容量固定;數(shù)組存儲的數(shù)據(jù)唯一
1.3 ArrayList的使用:
- 實例化一個數(shù)組對象
ArrayList arrList = new ArrayList ();
1.3.1 常用方法
- 給數(shù)組添加元素(可以添加重復(fù)的元素)
arrList.Add (1);
arrList.Add (2.3f);
arrList.Add ("Unity妹子");
arrList.Add (“Untiy妹子");
arrList.Add (3);
arrList.Add (4);
arrList.Add (5);
arrList.Add (6);
2.遍歷數(shù)組,輸出每一個元素(數(shù)組元素的類型不統(tǒng)一,所以最好用通用類型var修飾)
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
- 在指定索引位置插入元素(增加一個元素)
arrList.Insert (0, “Unity老漢");
- 移除指定元素的第一個匹配項
arrList.Remove (“Unity妹子");
- 移除指定下標(biāo)的元素
arrList.RemoveAt (1);
- 將整個集合元素順序反轉(zhuǎn)
arrList.Reverse ();
- 從給定下標(biāo)開始,反轉(zhuǎn)指定個數(shù)的元素
arrList.Reverse (3, 4);
- 判斷是否包含指定的元素
if (arrList.Contains (6)) {
Console.WriteLine ("厲害了,我的哥");
}
- 清除所有元素
arrList.Clear ();
- 集合元素個數(shù)
Console.WriteLine ("當(dāng)前集合元素個數(shù)為:" + arrList.Count);
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
1.3.2 ArrayList的特點:
1.支持自動改變大小的功能。
2.可以靈活的插入元素、刪除元素、訪問元素。
3.不是強(qiáng)類型,速度跟數(shù)組比起來要慢。
1.4 Stack棧的使用:
- 初始化對象
Stack sta = new Stack ();
1.4.1 常用方法
- 入棧,將對象插入Stack的頂部
sta.Push ("挖個坑");
sta.Push ("埋點土");
sta.Push ("根");
sta.Push ("莖");
sta.Push ("葉");
// sta.Push (null);//棧內(nèi)可以放空對象(但null必須要寫)
- 出棧,將移除并返回Stack頂部的對象
Console.WriteLine (sta.Pop ());
- 查看,返回位于Stack頂部的對象,但不移除
Console.WriteLine (sta.Peek ());
- 判斷指定元素是否在棧中
if (sta.Contains ("根")) {
Console.WriteLine ("根還在");
}
- 移除棧中所以元素
sta.Clear ();
- 獲取棧中元素個數(shù)
Console.WriteLine ("當(dāng)前棧中元素個數(shù)為:" + sta.Count);
Console.WriteLine ("\n當(dāng)前棧中元素為:");
foreach (var temp in sta) {
Console.WriteLine (temp);
}
- 將棧轉(zhuǎn)換成數(shù)組
object[] objArr = sta.ToArray ();
foreach (var temp in objArr) {
Console.Write (temp + " ");
}
- 將棧中元素拷貝到給定的數(shù)組中,需給定開始拷貝的數(shù)組索引
object[] arr = new object[10];
sta.CopyTo (arr, 5);
foreach (var temp in arr) {
Console.WriteLine (temp);
}
1.4.2 Stack總結(jié):
1.后進(jìn)先出(LIFO)的一種數(shù)據(jù)結(jié)構(gòu)。
2.隨著向 Stack 中添加元素,容量通過重新分配按需自動增 加。
3.Stack 接受 null 作為有效值并且允許重復(fù)的元素。
1.5 Queue隊列的使用
- 實例化對象
Queue que = new Queue ();
1.5.1常用方法
- 將對象添加到 Queue 的結(jié)尾處
que.Enqueue ("床前明月光");
que.Enqueue ("疑是地上霜");
que.Enqueue ("舉頭望明月");
que.Enqueue ("低頭思故鄉(xiāng)");
- 移除并返回位于 Queue 開始處的對象
Console.WriteLine ("出隊列的元素為:" + que.Dequeue ());
- 返回位于 Queue 開始處的對象但不將其移除
Console.WriteLine ("隊首元素為:" + que.Peek ());
- 清除隊列中的所有元素
que.Clear ();
- 判斷隊列中是否包含給定的元素
if (que.Contains ("舉頭望明月")) {
Console.WriteLine ("停車坐愛楓林晚");
}
- 獲取隊列元素個數(shù)
Console.WriteLine ("當(dāng)前隊列元素個數(shù)為:" + que.Count);
- 將隊列中的數(shù)據(jù)轉(zhuǎn)換成數(shù)組
object[] arrQue = que.ToArray ();
foreach (var temp in arrQue) {
Console.Write (temp + " ");
}
Console.WriteLine ();
foreach (var temp in que) {
Console.WriteLine (temp);
}
1.5.2 隊列總結(jié):
1.先進(jìn)先出(FIFO)的一種數(shù)據(jù)結(jié)構(gòu)。
2.隨著向Queue 中添加元素,容量通過重新分配按需自動增加。 可通過調(diào)用 TrimToSize 來減少容量。
3.Queue 接受 null 作為有效值并且允許重復(fù)的元素。
4.在AI尋路算法中經(jīng)常用的Queue。
1.6 Dictionary 字典的使用
用來存儲具有一一對應(yīng)關(guān)系的數(shù)據(jù)的集合
使用Key-Value(鍵值對)來存儲數(shù)據(jù)
字典中Key是唯一的,Value可以是變量,也可以是對象。
字典是一個泛型集合,實例化的時候,必須指定Key和Value的類型
實例化一個對象
Dictionary<string, int> dic = new Dictionary<string, int> ();
1.6.2 常用方法
1.添加鍵值對
dic.Add ("足療技師", 98);
dic.Add ("拔罐", 100);
dic.Add ("踩背", 88);
dic.Add ("大寶劍", 76);
dic ["刮痧"] = 120;
- 獲取指定的鍵相對應(yīng)的值,如果有,就將Key存儲到輸出參數(shù)
int aa = 0;// 定義變量,用戶存儲Key對應(yīng)的Value
bool have = dic.TryGetValue ("大寶劍", out aa);
if (have) {
Console.WriteLine ("大寶劍價格:" + aa);
} else {
Console.WriteLine ("大寶劍都沒有,差評");
}
- 清除字典中所有的鍵值對
dic.Clear ();
- 移除指定的鍵值
dic.Remove ("足療技師");
- 判斷字典中是否包含指定的Key
if (dic.ContainsKey ("踩背")) {
Console.WriteLine ("還不錯");
}
- 判斷字典中是否包含指定的Value
if (dic.ContainsValue (99)) {
Console.WriteLine ("太貴了");
}
- 字典中鍵值對的個數(shù)
Console.WriteLine ("字典中共有{0}個鍵值對", dic.Count);
- 獲取所有的Key
Dictionary<string, int>.KeyCollection keys = dic.Keys;
foreach (var temp in keys) {
Console.WriteLine (temp);
}
- 獲取所有的Value
Dictionary<string, int>.ValueCollection values = dic.Values;
foreach (var temp in values) {
Console.WriteLine (temp);
}
foreach (var temp in dic) {
Console.WriteLine (temp.Key + " -- " + temp.Value);
}
練習(xí):用戶輸入10個姓名,可以重復(fù)輸入同一個姓名,輸出每個姓名,并輸出每個姓名輸入的多少次。
- 思路:把姓名作為字典的Key,輸入次數(shù)作為Value;每次輸入判斷是否已經(jīng)存在該名字,如果存在就將value 加1,否則新添加
// 初始化字典
Dictionary<string, int> names = new Dictionary<string, int> ();
// 創(chuàng)建循環(huán),開始輸入姓名
string name = "0";
int count = 0;
while (count < 10) {
name = Console.ReadLine ().ToString ();
Console.WriteLine (name);
int v;
bool have = names.TryGetValue (name, out v);
if (have) {
v++;
names.Remove (name);// 先將原鍵值對移除
names.Add (name, v);
names [name] = v;
} else {
names.Add (name, 1);
names [name] = 1;
}
count++;
}
foreach (var temp in names) {
Console.WriteLine (temp.Key + "輸入了 " + temp.Value + "次");
}
1.7 List<T>類
- 初始化對象
List<int> list = new List<int> ();
1.7.1 常用方法
- 添加元素
list.Add (0);
list.Add (1);
list.Add (0);
// list.Add ("h");
// 添加一個數(shù)組
int[] arr = { 9, 9, 8 };
list.AddRange (arr);
- 插入元素在指定索引位置(注意,不能越界)
list.Insert (0, 2);
- 刪除指定元素的第一個匹配項
list.Remove (0);
- 刪除指定索引的元素
list.RemoveAt (1);
- 移除與指定的謂詞所定義的條件相匹配的所有元素(移除能夠整除2的元素)
list.RemoveAll (it => it % 2 == 0);
- 將整個數(shù)組元素進(jìn)行反轉(zhuǎn)
list.Reverse ();
- 獲取指定元素的下標(biāo)(第一個匹配項)
Console.WriteLine ("下標(biāo)為:" + list.IndexOf (9));
- 使用默認(rèn)比較器對數(shù)組進(jìn)行排序
list.Sort ();
- 判斷數(shù)組中是否包含給定的元素
Console.WriteLine (list.Contains (8));
- 清除所有元素
list.Clear ();
- 數(shù)組元素個數(shù)
Console.WriteLine (list.Count);
for (int i = 0; i < list.Count; i++) {
Console.Write (list [i] + " ");
}
1.7.2 List總結(jié)
1.于ArrayList相比, List<T> 類在大多數(shù)情況下執(zhí)行得更好 并且是類型安全的。
- 若List<T> 類的類型 T 使用引用類型,則兩個類的行為是 完全相同的。 但是,如果對類型 T 使用值類型,則需要考慮 實現(xiàn)和裝箱問題。
1.8 哈希表 -- 類似于字典,也是采用鍵值對的形式來管理數(shù)據(jù)
- 實例化
Hashtable table = new Hashtable ();
- 添加元素
table.Add (98, "越南新娘");
- 哈希表中不能直接得到值,需要進(jìn)行里氏轉(zhuǎn)換
string value = (string)table [98];
Console.WriteLine ("哈希表的值是:" + value);
本次講解就到這里,有關(guān)技術(shù)問題請小伙伴們添加QQ群:941928511,大家一起探討!
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上原文出處鏈接和本聲明