1.Array:底層資料結構都是陣列;
{ //Array //讀取快、增刪慢 Console.WriteLine("***********Array*********"); int[] intArray = new int[3]; intArray[0] = 123; string[] stringArray = new string[] { "123", "234" }; } { //ArrayList 不定長的,連續分配的 //元素沒有型別限制,任何元素都是當成object處理,如果是值型別,會有裝箱操作 //讀取快、增刪慢 ArrayList arrayList = new ArrayList(); arrayList.Add("eleven"); arrayList.Add("Is"); arrayList.Add(123);//add增加長度 //arrayList[4] = 26;//索引賦值,不會增加長度 //刪除資料 arrayList.RemoveAt(4); arrayList.Remove("eleven"); } { //List:也是Array,記憶體上都是連續擺放的,不定長;泛型,保證型別安全,避免裝箱拆箱 //讀取快、增刪慢 List<int> intList = new List<int>() { 1, 2, 3, 4, 5 }; intList.Add(123); }
2.連結串列:底層是連結串列實現
//連結串列 { //LinkedList:泛型的特點;連結串列,元素不連續分配,每個元素都有記錄前後節點 Console.WriteLine("******LinkList<T>******"); LinkedList<int> linkedList = new LinkedList<int>(); linkedList.AddFirst(123); linkedList.AddLast(456); bool isContain = linkedList.Contains(123); LinkedListNode<int> node123 = linkedList.Find(123); linkedList.AddBefore(node123, 0); linkedList.AddAfter(node123, 9); linkedList.Remove(456); linkedList.Remove(node123); linkedList.RemoveFirst(); linkedList.RemoveLast(); linkedList.Clear(); } { //queue 就是連結串列 先進先出 放任務延遲執行,A不斷寫入日誌任務,B不斷獲取任務去執行 Queue<string> numbers = new Queue<string>(); numbers.Enqueue("one"); numbers.Enqueue("two"); numbers.Enqueue("three"); numbers.Enqueue("four"); numbers.Enqueue("five"); foreach (var number in numbers) { Console.WriteLine(number); } Console.WriteLine($"Dequeueing {numbers.Dequeue()}");//獲取第一個移除元素 Console.WriteLine($"peek :{numbers.Peek()}");//獲取第一個卻不移除 Queue<string> queueCopy = new Queue<string>(numbers.ToArray());//可以直接將陣列傳進去 queueCopy.Clear();//清空 } { //Stack 就是棧 先進後出;也是個連結串列 Stack<string> numbers = new Stack<string>(); numbers.Push("one"); numbers.Push("two"); numbers.Push("three"); numbers.Push("four"); numbers.Push("five"); foreach (var number in numbers) { Console.WriteLine(number); } Console.WriteLine($"Pop {numbers.Pop()}"); Console.WriteLine($"Peek {numbers.Peek()}"); Stack<string> stackCopy = new Stack<string>(numbers.ToArray()); stackCopy.Clear(); }
3.Set;可去重
//HashSet //集合:hash分佈,元素間沒有關係,動態增加容量,可以去重 //應用場景:去重 HashSet<string> hashSet = new HashSet<string>(); hashSet.Add("123"); hashSet.Add("689"); hashSet.Add("456"); hashSet.Add("12345"); hashSet.Add("12345"); hashSet.Add("12345"); { HashSet<string> hashSet1 = new HashSet<string>(); hashSet1.Add("123"); hashSet1.Add("689"); hashSet1.Add("789"); hashSet1.Add("12345"); hashSet1.Add("123456"); hashSet1.SymmetricExceptWith(hashSet);//補 hashSet1.UnionWith(hashSet);//並 hashSet1.ExceptWith(hashSet);//差 hashSet1.IntersectWith(hashSet);//交 hashSet1.ToList(); hashSet1.Clear(); } } { //SortSet //排序的集合:去重 而且排序 SortedSet<string> sortedSet = new SortedSet<string>(); sortedSet.Add("123"); sortedSet.Add("689"); sortedSet.Add("456"); sortedSet.Add("12345"); sortedSet.Add("12345"); Console.WriteLine(sortedSet.Count); Console.WriteLine(sortedSet.Contains("12345")); //也能交差並補 sortedSet.ToList(); sortedSet.Clear(); }
4.key-value型
//key-value { //Hashtable key-value 體積可以動態增加,拿著key計算一個地址,然後放入key-value //object-裝箱拆箱,如果不同的key得到相同的地址,第二個在前面地址上+1 //查詢的時候,如果地址對應資料的key不對,那就+1查詢 //浪費了空間,Hashtable是基於陣列實現 //查詢個資料,一次定位,增刪 一次定位 、增刪改查 都很快 //浪費空間,資料太多,重複定位,效率就下去了 Hashtable table = new Hashtable(); table.Add("123", "456"); table[234] = 456; table[32] = 456; table["eleven"] = 345; foreach (DictionaryEntry item in table) { Console.WriteLine(item.Key.ToString()); Console.WriteLine(item.Value.ToString()); } Hashtable.Synchronized(table);//只有一個執行緒寫,多個執行緒讀,執行緒安全 } { //字典:泛型:key-value,新增是有順序的 Dictionary<int, string> dic = new Dictionary<int, string>(); dic.Add(1, "haha"); dic.Add(2, "ee"); } { //SortedDictory 排序欄位,可對鍵進行排序 SortedDictionary<int, string> dic = new SortedDictionary<int, string>(); } { //SortedList 可根據鍵進行排序 SortedList sortedList = new SortedList(); sortedList.Add("jj", "e"); sortedList.Add("jj", "f");//新增重複的鍵 會報錯 }
5.執行緒安全的集合列舉
//ConcurrentQueue 執行緒安全版本的Queue //ConcurrentStack 執行緒安全版本的Stack //ConcurrentBag 執行緒安全的物件集合 //ConcurrentDictionary執行緒安全的Dictionary //BlockingCollection
6.迭代器:延遲訪問
public class Yield { public IEnumerable<int> Power() { for(int i = 0; i < 10; i++) { yield return this.Get(i); } } public IEnumerable<int> Common() { List<int> intList = new List<int>(); for(int i = 0; i < 10; i++) { intList.Add(this.Get(i)); } return intList; } private int Get(int i) { Thread.Sleep(2000); return DateTime.Now.Day * i; } }
呼叫如下:
Yield yield = new Yield(); foreach (var item in yield.Common()) { Console.WriteLine(item); } foreach (var item in yield.Power()) //延遲訪問 { Console.WriteLine(item); }