B站看寶蓮燈字逗。人沉香正在那撕心裂肺地哭喊:“我要怎樣才能打敗我的舅舅梆础?V姘帷笨腥!”
彈幕飄過(guò)一行字:你正月里剪個(gè)頭。
========================手動(dòng)分割線(xiàn)==========================
一勇垛、集合
- 集合提供一種靈活的處理方法脖母。
- 與數(shù)組不同,處理的對(duì)象組可根據(jù)程序更改的需要?jiǎng)討B(tài)地增長(zhǎng)和收縮。
- 對(duì)于某些集合,您可以為放入該集合的任何對(duì)象分配一個(gè)“鍵”,以便使用該鍵快速檢索對(duì)象窥摄。
- 注意:集合是類(lèi),因此必須聲明新集合后,才能向該集合中添加元素镶奉。
- 集合分類(lèi):非泛型集合和泛型集合
- 使用非泛型集合的需引入:System.Collections命名空間。
- 使用泛型集合需引入:System.Collections.Generic命名空間
1.1 System.Collections 命名空間下的集合類(lèi):
- ArrayList:表示大小根據(jù)需要?jiǎng)討B(tài)增加的數(shù)組對(duì)象
- Hashtable:表示根據(jù)鍵的哈希代碼進(jìn)行組織的鍵/值對(duì)的集合
- Queue:隊(duì)列崭放,表示對(duì)象先進(jìn)先出(FIFO)
- Stack:棧哨苛,表示對(duì)象后進(jìn)先出(LIFO)
1.2 System.Collections.Generic命名空間下的集合類(lèi):
- Dictionary<TKey, TValue>:表示根據(jù)鍵進(jìn)行組織的鍵/值對(duì)的集合。
- List<T>:表示課通過(guò)索引訪問(wèn)的對(duì)象的列表币砂,提供用于對(duì)列表進(jìn)行搜索建峭、排序和修改的方法。
- Queue<T>:表示對(duì)象的先進(jìn)先出 (FIFO) 集合
- Stack<T>:表示對(duì)象的后進(jìn)先出 (LIFO) 集合
- SortedList<TKye,TValue>:表示根據(jù)鍵進(jìn)行排序的鍵/值對(duì)的集合,而鍵基于的是相關(guān)的IComparer<T>實(shí)現(xiàn)
- 創(chuàng)建數(shù)組决摧,回顧之前的知識(shí)點(diǎn):
int[] arr = new int[3]{ 1, 2, 3 };
// 遍歷數(shù)組
foreach (int temp in arr) {
Console.WriteLine (temp);
}
- 數(shù)組的缺點(diǎn):數(shù)組初始化以后亿蒸,容量固定;數(shù)組存儲(chǔ)的數(shù)據(jù)唯一
1.3 ArrayList的使用:
- 實(shí)例化一個(gè)數(shù)組對(duì)象
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ù)組掌桩,輸出每一個(gè)元素(數(shù)組元素的類(lèi)型不統(tǒng)一边锁,所以最好用通用類(lèi)型var修飾)
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
- 在指定索引位置插入元素(增加一個(gè)元素)
arrList.Insert (0, “Unity老漢");
- 移除指定元素的第一個(gè)匹配項(xiàng)
arrList.Remove (“Unity妹子");
- 移除指定下標(biāo)的元素
arrList.RemoveAt (1);
- 將整個(gè)集合元素順序反轉(zhuǎn)
arrList.Reverse ();
- 從給定下標(biāo)開(kāi)始,反轉(zhuǎn)指定個(gè)數(shù)的元素
arrList.Reverse (3, 4);
- 判斷是否包含指定的元素
if (arrList.Contains (6)) {
Console.WriteLine ("厲害了波岛,我的哥");
}
- 清除所有元素
arrList.Clear ();
- 集合元素個(gè)數(shù)
Console.WriteLine ("當(dāng)前集合元素個(gè)數(shù)為:" + arrList.Count);
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
1.3.2 ArrayList的特點(diǎn):
1.支持自動(dòng)改變大小的功能茅坛。
2.可以靈活的插入元素、刪除元素则拷、訪問(wèn)元素贡蓖。
3.不是強(qiáng)類(lèi)型,速度跟數(shù)組比起來(lái)要慢。
1.4 Stack棧的使用:
- 初始化對(duì)象
Stack sta = new Stack ();
1.4.1 常用方法
- 入棧煌茬,將對(duì)象插入Stack的頂部
sta.Push ("挖個(gè)坑");
sta.Push ("埋點(diǎn)土");
sta.Push ("根");
sta.Push ("莖");
sta.Push ("葉");
// sta.Push (null);//棧內(nèi)可以放空對(duì)象(但null必須要寫(xiě))
- 出棧斥铺,將移除并返回Stack頂部的對(duì)象
Console.WriteLine (sta.Pop ());
- 查看,返回位于Stack頂部的對(duì)象,但不移除
Console.WriteLine (sta.Peek ());
- 判斷指定元素是否在棧中
if (sta.Contains ("根")) {
Console.WriteLine ("根還在");
}
- 移除棧中所以元素
sta.Clear ();
- 獲取棧中元素個(gè)數(shù)
Console.WriteLine ("當(dāng)前棧中元素個(gè)數(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ù)組中坛善,需給定開(kāi)始拷貝的數(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 中添加元素,容量通過(guò)重新分配按需自動(dòng)增 加邻眷。
3.Stack 接受 null 作為有效值并且允許重復(fù)的元素。
1.5 Queue隊(duì)列的使用
- 實(shí)例化對(duì)象
Queue que = new Queue ();
1.5.1常用方法
- 將對(duì)象添加到 Queue 的結(jié)尾處
que.Enqueue ("床前明月光");
que.Enqueue ("疑是地上霜");
que.Enqueue ("舉頭望明月");
que.Enqueue ("低頭思故鄉(xiāng)");
- 移除并返回位于 Queue 開(kāi)始處的對(duì)象
Console.WriteLine ("出隊(duì)列的元素為:" + que.Dequeue ());
- 返回位于 Queue 開(kāi)始處的對(duì)象但不將其移除
Console.WriteLine ("隊(duì)首元素為:" + que.Peek ());
- 清除隊(duì)列中的所有元素
que.Clear ();
- 判斷隊(duì)列中是否包含給定的元素
if (que.Contains ("舉頭望明月")) {
Console.WriteLine ("停車(chē)坐愛(ài)楓林晚");
}
- 獲取隊(duì)列元素個(gè)數(shù)
Console.WriteLine ("當(dāng)前隊(duì)列元素個(gè)數(shù)為:" + que.Count);
- 將隊(duì)列中的數(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 隊(duì)列總結(jié):
1.先進(jìn)先出(FIFO)的一種數(shù)據(jù)結(jié)構(gòu)笙纤。
2.隨著向Queue 中添加元素,容量通過(guò)重新分配按需自動(dòng)增加耗溜。 可通過(guò)調(diào)用 TrimToSize 來(lái)減少容量。
3.Queue 接受 null 作為有效值并且允許重復(fù)的元素省容。
4.在AI尋路算法中經(jīng)常用的Queue。
1.6 Dictionary 字典的使用
用來(lái)存儲(chǔ)具有一一對(duì)應(yīng)關(guān)系的數(shù)據(jù)的集合
使用Key-Value(鍵值對(duì))來(lái)存儲(chǔ)數(shù)據(jù)
字典中Key是唯一的燎字,Value可以是變量,也可以是對(duì)象腥椒。
字典是一個(gè)泛型集合,實(shí)例化的時(shí)候候衍,必須指定Key和Value的類(lèi)型
實(shí)例化一個(gè)對(duì)象
Dictionary<string, int> dic = new Dictionary<string, int> ();
1.6.2 常用方法
1.添加鍵值對(duì)
dic.Add ("足療技師", 98);
dic.Add ("拔罐", 100);
dic.Add ("踩背", 88);
dic.Add ("大寶劍", 76);
dic ["刮痧"] = 120;
- 獲取指定的鍵相對(duì)應(yīng)的值笼蛛,如果有,就將Key存儲(chǔ)到輸出參數(shù)
int aa = 0;// 定義變量蛉鹿,用戶(hù)存儲(chǔ)Key對(duì)應(yīng)的Value
bool have = dic.TryGetValue ("大寶劍", out aa);
if (have) {
Console.WriteLine ("大寶劍價(jià)格:" + aa);
} else {
Console.WriteLine ("大寶劍都沒(méi)有滨砍,差評(píng)");
}
- 清除字典中所有的鍵值對(duì)
dic.Clear ();
- 移除指定的鍵值
dic.Remove ("足療技師");
- 判斷字典中是否包含指定的Key
if (dic.ContainsKey ("踩背")) {
Console.WriteLine ("還不錯(cuò)");
}
- 判斷字典中是否包含指定的Value
if (dic.ContainsValue (99)) {
Console.WriteLine ("太貴了");
}
- 字典中鍵值對(duì)的個(gè)數(shù)
Console.WriteLine ("字典中共有{0}個(gè)鍵值對(duì)", 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í):用戶(hù)輸入10個(gè)姓名,可以重復(fù)輸入同一個(gè)姓名,輸出每個(gè)姓名,并輸出每個(gè)姓名輸入的多少次。
- 思路:把姓名作為字典的Key妖异,輸入次數(shù)作為Value惋戏;每次輸入判斷是否已經(jīng)存在該名字,如果存在就將value 加1他膳,否則新添加
// 初始化字典
Dictionary<string, int> names = new Dictionary<string, int> ();
// 創(chuàng)建循環(huán)响逢,開(kāi)始輸入姓名
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);// 先將原鍵值對(duì)移除
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>類(lèi)
- 初始化對(duì)象
List<int> list = new List<int> ();
1.7.1 常用方法
- 添加元素
list.Add (0);
list.Add (1);
list.Add (0);
// list.Add ("h");
// 添加一個(gè)數(shù)組
int[] arr = { 9, 9, 8 };
list.AddRange (arr);
- 插入元素在指定索引位置(注意,不能越界)
list.Insert (0, 2);
- 刪除指定元素的第一個(gè)匹配項(xiàng)
list.Remove (0);
- 刪除指定索引的元素
list.RemoveAt (1);
- 移除與指定的謂詞所定義的條件相匹配的所有元素(移除能夠整除2的元素)
list.RemoveAll (it => it % 2 == 0);
- 將整個(gè)數(shù)組元素進(jìn)行反轉(zhuǎn)
list.Reverse ();
- 獲取指定元素的下標(biāo)(第一個(gè)匹配項(xiàng))
Console.WriteLine ("下標(biāo)為:" + list.IndexOf (9));
- 使用默認(rèn)比較器對(duì)數(shù)組進(jìn)行排序
list.Sort ();
- 判斷數(shù)組中是否包含給定的元素
Console.WriteLine (list.Contains (8));
- 清除所有元素
list.Clear ();
- 數(shù)組元素個(gè)數(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> 類(lèi)在大多數(shù)情況下執(zhí)行得更好 并且是類(lèi)型安全的棕孙。
- 若List<T> 類(lèi)的類(lèi)型 T 使用引用類(lèi)型,則兩個(gè)類(lèi)的行為是 完全相同的舔亭。 但是,如果對(duì)類(lèi)型 T 使用值類(lèi)型,則需要考慮 實(shí)現(xiàn)和裝箱問(wèn)題。
1.8 哈希表 -- 類(lèi)似于字典蟀俊,也是采用鍵值對(duì)的形式來(lái)管理數(shù)據(jù)
- 實(shí)例化
Hashtable table = new Hashtable ();
- 添加元素
table.Add (98, "越南新娘");
- 哈希表中不能直接得到值钦铺,需要進(jìn)行里氏轉(zhuǎn)換
string value = (string)table [98];
Console.WriteLine ("哈希表的值是:" + value);
本次講解就到這里,有關(guān)技術(shù)問(wèn)題請(qǐng)小伙伴們添加QQ群:941928511肢预,大家一起探討矛洞!
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明