目錄
列表(List)
特點
創建列表
RemoveAll 刪除與之條件相匹配的數據 ?會返回刪除的個數
Capacity 獲取或設置列表的容量
更多方法可參照上篇文章:C#_ArrayList動態數組
字典(Dictionary)
特點
定義一個字典
向字典中添加數據Add?
獲取字典中儲存的數據個數Count
使用索引器可以訪問字典中的某個數據
ContainsKey(); 判斷字典中是否包含某個 鍵
ContainsValue(); 判斷字典中是否包含某個 值
列表與字典的選擇
練習
在 C# 中,列表(List)和字典(Dictionary)是兩種常用的集合類型,用于存儲和管理數據。它們各有特點,適用于不同的場景。
列表(List<T>)
List<T>
?是一種動態數組,它可以存儲相同類型的元素,并且可以動態調整大小。
列表是屬于集合類里面的 , 集合類:用來儲存一堆數據的 ?是數據的集合 ?列表:只是集合中的一種儲存數據的表達方式
特點:
- 元素按順序存儲,可通過索引訪問
- 允許存儲重復元素
- 查找元素需要遍歷(除非知道索引)
- 適合需要按順序訪問元素的場景
創建列表
?List列表屬于是泛型類 列表在創建的時候是可以給他一些初始值的 在()后面跟上{}里面寫數據
跟數組差不多 ?但是數組的長度是固定的 列表是可以添加數據的 ?長度也是不固定的
// 創建了一個 操作整數類型的列表List<int> list = new List<int>() { 10, 212, 423, 124, 855, 546, 17, 528 };// 創建了一個 操作字符串類型的列表
List<string> liststr = new List<string>();
// Add末尾添加數據
liststr.Add("張三");
liststr.Add("李四");
RemoveAll 刪除與之條件相匹配的數據 ?會返回刪除的個數
internal class Program{static void Main(string[] args){List<string> liststr = new List<string>() { "張三", "李四", "李四", "李四", "李四", "李四" ,"王五"};//RemoveAll 刪除與之條件相匹配的數據 會返回刪除的個數 //定義a記錄刪除個數int a = liststr.RemoveAll(EndsWithSaurus);//顯示列表內容Console.WriteLine(a);foreach (string item in liststr){Console.WriteLine(item);}}private static bool EndsWithSaurus(String s){return s.EndsWith("李四");}}
運行結果
Capacity 獲取或設置列表的容量
列表的內部數據在儲存是其實也是使用的數組 ?一個空的列表會有一個長度為0的數組 當給列表添加數據的時候 默認情況下 列表的容量會擴大為4 如果添加第5個數據就會擴容為8 ....倍增 ?如果自己設置了容量 就會根據設定的值倍增 ? 當列表的容量發生變化時 會重新創建新的數組 Array.Copy() 將舊數組中的數據復制到新數組里面來
List<int> listint = new List<int>();空的列表。長度起始為0,后期加入數據會自動擴大空間0->4->8->16->...->n*2
Console.WriteLine(listint.Capacity);長度起始為10,后期加入數據會自動擴大空間20->40->80->160->...->n*2
listint.Capacity = 10;
Console.WriteLine(listint.Capacity);
更多方法可參照上篇文章:C#_ArrayList動態數組
字典(Dictionary<TKey, TValue>)
Dictionary<TKey, TValue>
?是一種鍵值對集合,每個元素都由一個鍵(Key)和一個值(Value)組成。
字典的作用:一般用于一些信息的記錄 ?用字典儲存的數據可以快速的查詢
字典: 類似于List 只能儲存類型固定的數據 長度不固定
List 使用索引進行數據的操作 ?字典要使用"鍵"進行數據操作
鍵: 標識,在一個字典中 鍵是唯一的 ?并且不能為null,如"姓名": 張三 ? "年齡":18 ? ?"性別":男
特點:
- 元素以鍵值對形式存儲
- 鍵必須唯一,值可以重復
- 通過鍵可以快速查找對應的值
- 適合需要通過鍵快速訪問數據的場景
定義一個字典
格式:Dictionary<鍵的數據類型,值的數據類型> ?變量 ?= new Dictionary <鍵的數據類型,值的數據類型>();
//在創建字典是 可以給一些初始數據Dictionary<string,int> keyValuePairs = new Dictionary<string, int>() {{"Name",666},{"sex" , 1 },{"年齡",18 }};
向字典中添加數據Add?
獲取字典中儲存的數據個數Count
//向字典中添加數據 AddkeyValuePairs.Add("身高", 178);// 獲取字典中儲存的數據個數Console.WriteLine(keyValuePairs.Count);
使用索引器可以訪問字典中的某個數據
// 使用索引器Console.WriteLine(keyValuePairs["Name"]);//修改鍵為Name的數據值keyValuePairs["Name"] = 888;
ContainsKey(); 判斷字典中是否包含某個 鍵
ContainsValue(); 判斷字典中是否包含某個 值
//判斷字典中是否包含某個 鍵
Console.WriteLine(keyValuePairs.ContainsKey("吳凡"));
//判斷字典中是否包含某個 值
Console.WriteLine(keyValuePairs.ContainsValue(888));
列表與字典的選擇
- 當需要按順序存儲和訪問元素時,選擇?
List<T>
- 當需要通過唯一標識符(鍵)快速查找數據時,選擇?
Dictionary<TKey, TValue>
- 列表的查找時間復雜度是 O (n),而字典的查找時間復雜度接近 O (1)
特性 | List<T>(列表) | Dictionary<TKey, TValue>(字典) |
---|---|---|
存儲結構 | 線性存儲相同類型的元素 | 鍵值對(Key-Value)形式存儲 |
訪問方式 | 通過索引(int 類型)訪問 | 通過鍵(TKey 類型)訪問 |
元素唯一性 | 允許重復元素 | 鍵(Key)必須唯一,值(Value)可重復 |
查找效率 | 需遍歷查找(已知索引時為 O (1),否則為 O (n)) | 通過鍵查找效率高,接近 O (1) |
適用場景 | 需要按順序訪問、存儲一組相同類型數據 | 需要通過唯一標識快速查詢、修改數據 |
元素順序 | 保持插入順序 | 不保證元素順序(.NET Core 3.0+ 部分實現保留插入順序) |
核心操作 | Add、Insert、Remove、IndexOf 等 | Add、ContainsKey、Remove、TryGetValue 等 |
內存占用 | 相對較少 | 相對較多(需額外存儲鍵的哈希信息) |
通過上述對比可以看出,List<T> 更適合處理有序數據集合,而 Dictionary<TKey, TValue> 則在需要快速鍵值查找的場景中更具優勢,實際開發中可根據具體需求選擇合適的集合類型。
在實際開發中,這兩種集合類型經常結合使用,例如?List<Dictionary<string, object>>
?可以用來表示一組具有多個屬性的對象。
練習:
把數據存儲到字典中.用戶輸入需要查詢的省份,打印對應的市,如:
輸入:河北省?????????顯示 :石家莊市? 唐山市
輸入:山西省? ? ? ? ?顯示 :太原市? ? ? 大同市?
輸入:河南省?????????顯示 :鄭州市? ? 南陽市
//創建一個空字典 Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();//以下三種在字典添加數據的方式 List<string> list = new List<string>() { "鄭州市","商丘市"}; dic.Add("河南省", list);dic.Add("河北省", new List<string>() {"石家莊市","唐山市" });List<string> list1 = new List<string>(); list1.Add("太原市"); list1.Add("大同市"); dic.Add("山西省", list1);
//拿到字典中所有的鍵 遍歷字典 拿到字典中的所有的數據 { "xxxx" : xxxx} foreach (KeyValuePair<string, List<string>> item in dic) {//item 是鍵和值一起存在的// 可以獲取到 字典中當前數據的鍵Console.WriteLine(item.Key);// 可以獲取到 字典中值列表當前數據的數據foreach (string n in item.Value) { Console.WriteLine(n); } }
Console.WriteLine("請輸入要查詢的省份");string user = Console.ReadLine();//判斷 字典中是否包含用戶輸入的鍵if (dic.ContainsKey(user)){// 如果存在 就拿到當前鍵所對應的值// 因為我們在寫字典數據時 值的數據使用List列表儲存的 所以我們根據鍵訪問的值就是一個列表// 循環列表(dic[user]) 拿到里面每個數據item //dic[user] 通過索引 訪問字典中鍵為user的值foreach (string item in dic[user]){Console.WriteLine(item);}}else{Console.WriteLine("輸入省份字典中不存在");}