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

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



========================手動分割線==========================

一、集合

  • 集合提供一種靈活的處理方法。
  • 與數(shù)組不同,處理的對象組可根據(jù)程序更改的需要動態(tài)地增長和收縮。
  • 對于某些集合,您可以為放入該集合的任何對象分配一個“鍵”,以便使用該鍵快速檢索對象。
  • 注意:集合是類,因此必須聲明新集合后,才能向該集合中添加元素。
  • 集合分類:非泛型集合和泛型集合
  • 使用非泛型集合的需引入:System.Collections命名空間。
  • 使用泛型集合需引入:System.Collections.Generic命名空間

1.1 System.Collections 命名空間下的集合類:

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

1.2 System.Collections.Generic命名空間下的集合類:

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

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

  1. 入棧,將對象插入Stack的頂部
            sta.Push ("挖個坑");
            sta.Push ("埋點土");
            sta.Push ("根");
            sta.Push ("莖");
            sta.Push ("葉");
            //    sta.Push (null);//棧內(nèi)可以放空對象(但null必須要寫)
  1. 出棧,將移除并返回Stack頂部的對象
            Console.WriteLine (sta.Pop ());
  1. 查看,返回位于Stack頂部的對象,但不移除
            Console.WriteLine (sta.Peek ());
  1. 判斷指定元素是否在棧中
            if (sta.Contains ("根")) {
                Console.WriteLine ("根還在");
            }
  1. 移除棧中所以元素
            sta.Clear ();
  1. 獲取棧中元素個數(shù)
            Console.WriteLine ("當(dāng)前棧中元素個數(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ù)組中,需給定開始拷貝的數(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常用方法

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容