C#基礎(chǔ)-集合講解-14

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):

  1. ArrayList:表示大小根據(jù)需要?jiǎng)討B(tài)增加的數(shù)組對(duì)象
  2. Hashtable:表示根據(jù)鍵的哈希代碼進(jìn)行組織的鍵/值對(duì)的集合
  3. Queue:隊(duì)列崭放,表示對(duì)象先進(jìn)先出(FIFO)
  4. Stack:棧哨苛,表示對(duì)象后進(jìn)先出(LIFO)

1.2 System.Collections.Generic命名空間下的集合類(lèi):

  1. Dictionary<TKey, TValue>:表示根據(jù)鍵進(jìn)行組織的鍵/值對(duì)的集合。
  2. List<T>:表示課通過(guò)索引訪問(wèn)的對(duì)象的列表币砂,提供用于對(duì)列表進(jìn)行搜索建峭、排序和修改的方法。
  3. Queue<T>:表示對(duì)象的先進(jìn)先出 (FIFO) 集合
  4. Stack<T>:表示對(duì)象的后進(jìn)先出 (LIFO) 集合
  5. 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 常用方法

  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);
            }
  1. 在指定索引位置插入元素(增加一個(gè)元素)
            arrList.Insert (0, “Unity老漢");
  1. 移除指定元素的第一個(gè)匹配項(xiàng)
            arrList.Remove (“Unity妹子");
  1. 移除指定下標(biāo)的元素
            arrList.RemoveAt (1);
  1. 將整個(gè)集合元素順序反轉(zhuǎn)
            arrList.Reverse ();
  1. 從給定下標(biāo)開(kāi)始,反轉(zhuǎn)指定個(gè)數(shù)的元素
            arrList.Reverse (3, 4);
  1. 判斷是否包含指定的元素
            if (arrList.Contains (6)) {
                Console.WriteLine ("厲害了波岛,我的哥");
            }
  1. 清除所有元素
            arrList.Clear ();
  1. 集合元素個(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 常用方法

  1. 入棧煌茬,將對(duì)象插入Stack的頂部
            sta.Push ("挖個(gè)坑");
            sta.Push ("埋點(diǎn)土");
            sta.Push ("根");
            sta.Push ("莖");
            sta.Push ("葉");
            //    sta.Push (null);//棧內(nèi)可以放空對(duì)象(但null必須要寫(xiě))
  1. 出棧斥铺,將移除并返回Stack頂部的對(duì)象
            Console.WriteLine (sta.Pop ());
  1. 查看,返回位于Stack頂部的對(duì)象,但不移除
            Console.WriteLine (sta.Peek ());
  1. 判斷指定元素是否在棧中
            if (sta.Contains ("根")) {
                Console.WriteLine ("根還在");
            }
  1. 移除棧中所以元素
            sta.Clear ();
  1. 獲取棧中元素個(gè)數(shù)
            Console.WriteLine ("當(dāng)前棧中元素個(gè)數(shù)為:" + sta.Count);
            Console.WriteLine ("\n當(dāng)前棧中元素為:");
            foreach (var temp in sta) {
                Console.WriteLine (temp);
            }
  1. 將棧轉(zhuǎn)換成數(shù)組
            object[] objArr = sta.ToArray ();
            foreach (var temp in objArr) {
                Console.Write (temp + " ");
            }
  1. 將棧中元素拷貝到給定的數(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常用方法

  1. 將對(duì)象添加到 Queue 的結(jié)尾處
            que.Enqueue ("床前明月光");
            que.Enqueue ("疑是地上霜");
            que.Enqueue ("舉頭望明月");
            que.Enqueue ("低頭思故鄉(xiāng)");
  1. 移除并返回位于 Queue 開(kāi)始處的對(duì)象
            Console.WriteLine ("出隊(duì)列的元素為:" + que.Dequeue ());
  1. 返回位于 Queue 開(kāi)始處的對(duì)象但不將其移除
            Console.WriteLine ("隊(duì)首元素為:" + que.Peek ());
  1. 清除隊(duì)列中的所有元素
            que.Clear ();
  1. 判斷隊(duì)列中是否包含給定的元素
            if (que.Contains ("舉頭望明月")) {
                Console.WriteLine ("停車(chē)坐愛(ài)楓林晚");
            }
  1. 獲取隊(duì)列元素個(gè)數(shù)
            Console.WriteLine ("當(dāng)前隊(duì)列元素個(gè)數(shù)為:" + que.Count);
  1. 將隊(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;
  1. 獲取指定的鍵相對(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)");
            }
  1. 清除字典中所有的鍵值對(duì)
            dic.Clear ();
  1. 移除指定的鍵值
            dic.Remove ("足療技師");
  1. 判斷字典中是否包含指定的Key
            if (dic.ContainsKey ("踩背")) {
                Console.WriteLine ("還不錯(cuò)");
            }
  1. 判斷字典中是否包含指定的Value
            if (dic.ContainsValue (99)) {
                Console.WriteLine ("太貴了");
            }
  1. 字典中鍵值對(duì)的個(gè)數(shù)
            Console.WriteLine ("字典中共有{0}個(gè)鍵值對(duì)", dic.Count);
  1. 獲取所有的Key
            Dictionary<string, int>.KeyCollection keys = dic.Keys;
            foreach (var temp in keys) {
                Console.WriteLine (temp);
            }
  1. 獲取所有的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 常用方法

  1. 添加元素
            list.Add (0);
            list.Add (1);
            list.Add (0);
//            list.Add ("h");
            // 添加一個(gè)數(shù)組
            int[] arr = { 9, 9, 8 };
            list.AddRange (arr);
  1. 插入元素在指定索引位置(注意,不能越界)
            list.Insert (0, 2);
  1. 刪除指定元素的第一個(gè)匹配項(xiàng)
            list.Remove (0);
  1. 刪除指定索引的元素
            list.RemoveAt (1);
  1. 移除與指定的謂詞所定義的條件相匹配的所有元素(移除能夠整除2的元素)
            list.RemoveAll (it => it % 2 == 0);
  1. 將整個(gè)數(shù)組元素進(jìn)行反轉(zhuǎn)
            list.Reverse ();
  1. 獲取指定元素的下標(biāo)(第一個(gè)匹配項(xiàng))
            Console.WriteLine ("下標(biāo)為:" + list.IndexOf (9));
  1. 使用默認(rèn)比較器對(duì)數(shù)組進(jìn)行排序
            list.Sort ();
  1. 判斷數(shù)組中是否包含給定的元素
            Console.WriteLine (list.Contains (8));
  1. 清除所有元素
            list.Clear ();
  1. 數(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)型安全的棕孙。

  1. 若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)附上原文出處鏈接和本聲明

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末误甚,一起剝皮案震驚了整個(gè)濱河市缚甩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窑邦,老刑警劉巖擅威,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冈钦,居然都是意外死亡郊丛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厉熟,“玉大人导盅,你說(shuō)我怎么就攤上這事∽嵘” “怎么了白翻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绢片。 經(jīng)常有香客問(wèn)我滤馍,道長(zhǎng),這世上最難降的妖魔是什么底循? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任巢株,我火速辦了婚禮,結(jié)果婚禮上熙涤,老公的妹妹穿的比我還像新娘阁苞。我一直安慰自己,他們只是感情好祠挫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布那槽。 她就那樣靜靜地躺著,像睡著了一般茸歧。 火紅的嫁衣襯著肌膚如雪倦炒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天软瞎,我揣著相機(jī)與錄音逢唤,去河邊找鬼。 笑死涤浇,一個(gè)胖子當(dāng)著我的面吹牛鳖藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只锭,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼著恩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蜻展?” 一聲冷哼從身側(cè)響起喉誊,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纵顾,沒(méi)想到半個(gè)月后伍茄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡施逾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年敷矫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了例获。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曹仗,死狀恐怖榨汤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怎茫,我是刑警寧澤收壕,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站轨蛤,受9級(jí)特大地震影響啼器,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俱萍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望告丢。 院中可真熱鬧枪蘑,春花似錦、人聲如沸岖免。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颅湘。三九已至话侧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闯参,已是汗流浹背瞻鹏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹿寨,地道東北人新博。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脚草,于是被迫代替她去往敵國(guó)和親赫悄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • C#集合 有兩種主要的集合類(lèi)型:泛型集合和非泛型集合馏慨。 泛型集合被添加在 .NET Framework 2.0 中...
    OctOcean閱讀 835評(píng)論 0 3
  • 四埂淮、集合框架 1:String類(lèi):字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串写隶。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 753評(píng)論 0 2
  • 數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)倔撞、組織、管理數(shù)據(jù)的方式 數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合 ...
    JunChow520閱讀 3,613評(píng)論 0 4
  • 9yue6 集合(Collection 一樟澜、集合的作用: 有兩種方式可以將對(duì)象分組: 1误窖、創(chuàng)建對(duì)象數(shù)組 2叮盘、創(chuàng)建對(duì)...
    cGunsNRoses閱讀 2,233評(píng)論 0 0