C# 數組與集合
Array
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _16._1_Array
{internal class Program{static void Main(string[] args){int[] ints1 = { 1, 2, 3, 4, 5,6,7,8 };//將數組中指定位置的數據恢復為對應類型的默認值//參數1:需要恢復的數組 參數2:開始的位置的索引 參數3恢復的個數Array.Clear(ints1,1,3);MyWriteArr(ints1);int[] ints2 = new int[10];//將參數1數組中的數據復制到參數2數組匯總,由參數3指定復制的個數//注意:復制的個數不能超過源數組的長度, 2.復制的個數不能超過新數組的長度Array.Copy(ints1, ints2, 6);MyWriteArr(ints2);//反轉數組Array.Reverse(ints1);MyWriteArr(ints1);//查找對應的數據在數組中第一次出現的位置,有則返回當前數據的索引值,如果沒有則返回-1Console.WriteLine(Array.IndexOf(ints1,8));int[] ages = { 15, 12, 31, 18, 14, 19 };//根據傳入的數據和方法,返回第一個滿足條件的數據,如果數組中沒有滿足條件的數據,則返回該類型的默認值//工作原理:循環該數組,并且每次循環調用傳遞的方法,將當前的數據通過參數傳遞到方法中,如果方法返回了true,則Find直接返回這個參數Console.WriteLine(Array.Find(ages,FinSamll18));Console.WriteLine(Array.Find(ages,v=>v<18));//FindIndex() 返回滿足查詢條件的這個值的索引的位置Console.WriteLine(Array.FindIndex(ages, v => v < 18));//從后往前查詢第一個滿足條件的數據Console.WriteLine(Array.FindLast(ages, v => v < 18));Console.WriteLine(Array.FindLastIndex(ages, v => v < 18));//查詢所有滿足條件的數據 返回值是一個數組int [] arr = Array.FindAll(ages, v => v < 18);MyWriteArr(arr);//判斷數組中的數據是否都滿足條件//所有的數據都滿足條件 則返回true 有一個不滿足就返回falseConsole.WriteLine(Array.TrueForAll(ages, v => v < 18));//判斷數據中至少有一個滿足條件//有一個滿足條件就返回true 所有不滿足就返回falseConsole.WriteLine(Array.Exists(ages, v => v < 18));string[] str1 = { "老李", "老王", "老五" };string[] str2 = new string[5];//將str1復制到str2中 從str2的位置開始放str1.CopyTo(str2,1);//獲取指定維度的數據的數量,返回值是32位的整數Console.WriteLine(str1.GetLength(0));//等同于 str1[0] ="老王";str1.SetValue("老王",0);Console.WriteLine(str1.GetValue(0));//判斷書中是否存在某個數據Console.WriteLine(str1.Contains("老王"));}public static void MyWriteArr(int[] arr){string s = "[";for (int i = 0; i < arr.Length; i++){s += arr[i] + ",";}s += "]";Console.WriteLine(s);}public static bool FinSamll18(int value){//if (value<18)//{// return true;//}//else//{// return false;//}return value < 18;}}}
C#集合(Collection)
C# 中的集合類(Collection)是專門用于數據存儲和檢索的類,類中提供了對棧(stack)、隊列(queue)、列表(list)和哈希表(hash table)的支持。大多數集合類都實現了相同的接口。
集合類的用途多種多樣,例如可以動態的為元素分配內存、根據索引訪問列表項等等,這些類創建 Object 類的對象集合,Object 類是 C# 中所有數據類型的基類。
C# 中的集合類型
在 System.Collections.Generic,System.Collections.Concurrent 和 System.Collections 命名空間下提供了許多集合類型,每種集合類型都有特定的用途,下面以 System.Collection 命名空間為例,該命名空間下提供的集合類型如下表所示:
類 | 描述和用法 |
---|---|
動態數組(ArrayList) | 動態數組表示可被單獨索引的對象的有序集合。 動態數組基本上與數組相似,唯一不同的是動態數組可以使用索引在指定的位置添加和移除項目,動態數組會自動重新調整自身的大小。 另外,動態數組也允許在列表中進行動態內存分配、增加、搜索、排序等等。 |
List | 類似ArrayList,只是List只能存儲相同類型的數據,List的長度也不是固定的 |
字典(Dictionary) | 類似List.只能存儲固定類型的數據,長度不固定 |
哈希表(Hashtable) | 哈希表可以使用鍵來訪問集合中的元素。 哈希表中的每一項都由一個鍵/值對組成,鍵用于訪問集合中的指定項。 |
排序列表(SortedList) | 排序列表是數組和哈希表的組合,可以使用鍵或索引來訪問列表中的各項。 排序列表中包含一個可使用鍵或索引訪問各項的列表,如果您使用索引訪問各項,則它是一個動態數組,如果您使用鍵訪問各項,則它就是一個哈希表。 另外,排序列表中的各項總是按鍵值進行排序的。 |
堆棧(Stack) | 堆棧代表了一個后進先出的對象集合。 當您需要對各項進行后進先出的訪問時,則可以使用堆棧。為堆棧中添加一項稱為推入項目,從堆棧中移除一項稱為彈出項目。 |
隊列(Queue) | 隊列代表了一個先進先出的對象集合。 當您需要對各項進行先進先出的訪問時,則可以使用隊列。為隊列中添加項目稱為入隊,為隊列中移除項目稱為出隊。 |
C# ArrayList:動態數組
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _16._2_ArrayList
{internal class Program{static void Main(string[] args){//ArrayList 動態數組 就是不給固定長度和存儲的數據的類型的集合//可以存儲任意類型的數據,并且長度會隨著數組內容的增加減少進行改變ArrayList list1 =new ArrayList() { "老王",1,true,new int[] {1} };Console.WriteLine(list1.Count);Console.WriteLine(list1[0]);//向ArrayList的尾部添加數據list1.Add("老李");int[] ints = { 666, 777, 888 };//將另一個集合的內容添加到ArrayList的尾部list1.AddRange(ints);//清空數組,刪除動態數組所有的數據,并將Count重置為0list1.Clear();list1.Add("老李");//在指定的索引位置插入數據list1.Insert(1, "老王");//在指定的位置插入集合的內容list1.InsertRange(2, ints);Console.WriteLine(list1.Contains("老李"));//從數組中截取對應的數據,返回值是一個新的ArrayList//參數1:開始的索引 參數2:截取的個數list1.GetRange(1,3);Console.WriteLine(list1.IndexOf("老李"));list1.Remove("老李");list1.RemoveAt(1);list1.RemoveRange(1,2);for (int i = 0; i < list1.Count; i++){Console.WriteLine(list1[i]);}}}
}
C# List:泛型集合
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _16._3_List
{internal class Program{static void Main(string[] args){//List 也是一個集合 類似ArrayList 只是List只能存儲相同類型的數據,List的長度也是不固定//格式: List<數據類型> 變量名=new List<數據類型>();List<int> list = new List<int>();Console.WriteLine(list[0]);Console.WriteLine(list.Count);list.Add(1);list.Remove();list.RemoveAt();list.Reverse();//.....}}
}
C# Dictionary 字典
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _16._4_Dictionary
{internal class Program{static void Main(string[] args){//Dictionary:類似List 只能存儲固定類型的數據 長度不固定//list使用索引進行數據的操作,字典使用"鍵"進行數據的操作//鍵:標識 在一個字典中 鍵是唯一的 并且不能為null// Dictionary<鍵的數據類型,值的數據類型> 變量名 = new Dictionary<鍵的數據類型,值的數據類型>();Dictionary<string,int> keyValuePairs = new Dictionary<string, int>(){{"name",32423 },{"k",1 },{"aa",1232 }};keyValuePairs.Add("a", 1);Console.WriteLine(keyValuePairs.Count);Console.WriteLine(keyValuePairs["k"]);keyValuePairs["k"] = 132;Console.WriteLine(keyValuePairs.ContainsKey("a"));Console.WriteLine(keyValuePairs.ContainsValue(1));}}
}
C# Hashtable:哈希表
在 C# 中,Hashtable(哈希表) 類表示根據鍵的哈希代碼進行組織的鍵(key)/值(value)對的集合,可以使用鍵來訪問集合中的元素。也就是說當您需要使用鍵來訪問指定元素時,可以選擇使用哈希表。
Hashtable 類中的屬性
下表中列出了 Hashtable 類中一些常用的屬性:
屬性 | 描述 |
---|---|
Count | 獲取哈希表中包含的鍵值對的個數 |
IsFixedSize | 獲取一個值,用來表示哈希表是否具有固定大小 |
IsReadOnly | 獲取一個值,用來表示哈希表是否只讀 |
Item | 獲取或設置與指定鍵關聯的值 |
Keys | 獲取一個 ICollection,其中包含哈希表中的鍵 |
Values | 獲取一個 ICollection,其中包含哈希表中的值 |
Hashtable 類中的方法
下表中列出了 Hashtable 類中一些常用的方法:
方法名 | 描述 |
---|---|
public virtual void Add(object key, object value) | 向哈希表中添加一個帶有指定的鍵和值的元素 |
public virtual void Clear() | 從哈希表中移除所有的元素 |
public virtual bool ContainsKey(object key) | 判斷哈希表是否包含指定的鍵 |
public virtual bool ContainsValue(object value) | 判斷哈希表是否包含指定的值 |
public virtual void Remove(object key) | 從哈希表中移除帶有指定的鍵的元素 |
C# SortedList:排序列表
在 C# 中,SortedList 類用來表示鍵/值對的集合,這些鍵/值對按照鍵值進行排序,并且可以通過鍵或索引訪問集合中的各個項。
我們可以將排序列表看作是數組和哈希表的組合,其中包含了可以使用鍵或索引訪問各項的列表。如果您使用索引訪問各項,那么它就是一個動態數組(ArrayList),如果您使用鍵訪問各項,那么它就是一個哈希表(Hashtable)。另外,集合中的各項總是按鍵值進行排序。
SortedList 類的中的屬性
下表列出了 SortedList 類中一些常用的屬性:
屬性 | 描述 |
---|---|
Capacity | 獲取或設置排序列表中可包含的元素個數 |
Count | 獲取排序列表中的元素個數 |
IsFixedSize | 判斷排序列表是否具有固定大小 |
IsReadOnly | 判斷排序列表是否只讀 |
Item | 獲取或設置排序列表中指定鍵所關聯的值 |
Keys | 獲取一個包含排序列表中所有鍵的集合 |
Values | 獲取一個包含排序列表中所有值的集合 |
SortedList 類的中的方法
下表列出了 SortedList 類中一些常用的方法:
方法名 | 描述 |
---|---|
public virtual void Add(object key, object value) | 向排序列表中添加一個帶有指定的鍵和值的元素 |
public virtual void Clear() | 從排序列表中移除所有的元素 |
public virtual bool ContainsKey(object key) | 判斷排序列表中是否包含指定的鍵 |
public virtual bool ContainsValue(object value) | 判斷排序列表中是否包含指定的值 |
public virtual object GetByIndex(int index) | 獲取排序列表中指定索引處的值 |
public virtual object GetKey(int index) | 獲取排序列表中指定索引處的鍵 |
public virtual IList GetKeyList() | 獲取排序列表中的鍵 |
public virtual IList GetValueList() | 獲取排序列表中的值 |
public virtual int IndexOfKey(object key) | 返回排序列表中指定鍵的索引,索引從零開始 |
public virtual int IndexOfValue(object value) | 返回排序列表中指定值第一次出現的索引,索引從零開始 |
public virtual void Remove(object key) | 從排序列表中移除帶有指定鍵的元素 |
public virtual void RemoveAt(int index) | 移除排序列表中指定索引處的元素 |
public virtual void TrimToSize() | 將排序列表的容量設置為排序列表中元素的實際個數 |
C# Stack:堆棧
在 C# 中,堆棧(Stack)類表示一個后進先出的對象集合,當您需要對項目進行后進先出的訪問時,則可以使用堆棧。向堆棧中添加元素稱為推入元素,從堆棧中移除元素稱為彈出元素。
Stack 類中的屬性
下表列出了 Stack 類中一些常用的屬性:
屬性 | 描述 |
---|---|
Count | 獲取堆棧中包含的元素個數 |
IsSynchronized | 判斷是否同步對堆棧的訪問(線程安全) |
SyncRoot | 獲取可用于同步對堆棧訪問的對象 |
Stack 類中的方法
下表列出了 Stack 類中一些常用的方法:
方法名 | 描述 |
---|---|
public virtual void Clear() | 從堆棧中移除所有的元素 |
public virtual bool Contains(object obj) | 判斷某個元素是否在堆棧中 |
public virtual object Peek() | 返回在堆棧頂部的對象,但不移除它 |
public virtual object Pop() | 移除并返回在堆棧頂部的對象 |
public virtual void Push(object obj) | 向堆棧頂部添加一個對象 |
public virtual object[] ToArray() | 復制堆棧到一個新的數組中 |
C# Queue:隊列
在 C# 中,隊列(Queue 類)與堆棧類似,它代表了一個先進先出的對象集合,當您需要對項目進行先進先出訪問時,則可以使用隊列。向隊列中添加元素稱為入隊(enqueue),從堆棧中移除元素稱為出隊(deque)。
Queue 類中的屬性
下表列出了 Queue 類的一些常用的屬性:
屬性 | 描述 |
---|---|
Count | 獲取隊列中包含的元素個數 |
IsSynchronized | 判斷是否同步對隊列的訪問(線程安全) |
SyncRoot | 獲取可用于同步對隊列訪問的對象 |
Queue 類中的方法
下表列出了 Queue 類的一些常用的方法:
方法名 | 描述 |
---|---|
public virtual void Clear() | 從隊列中移除所有的元素 |
public virtual bool Contains(object obj) | 判斷某個元素是否在隊列中 |
public virtual object Dequeue() | 移除并返回在隊列開頭的對象 |
public virtual void Enqueue(object obj) | 向隊列的末尾處添加一個對象 |
public virtual object[] ToArray() | 復制隊列到一個新的數組中 |
public virtual void TrimToSize() | 將隊列的容量設置為隊列中元素的實際個數 |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _16._6_Stack和Queue
{internal class Program{static void Main(string[] args){//聲明一個堆棧Stack<string> stack = new Stack<string>();//添加一個數據stack.Push("a");//刪除一個數據(只能刪除最后的那個數據)stack.Pop();//獲取堆棧中最上層的數據Console.WriteLine(stack.Peek());Console.WriteLine(stack.ToArray());stack.Clear();Queue<string> queue = new Queue<string>();//入隊queue.Enqueue("a");Console.WriteLine(queue.Dequeue());}}
}