資料結構學習

你好呀嗯嗯發表於2024-08-21

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);
                }

相關文章