非泛型容器需要引入System.Collections的命名空间
泛型容器需要引入System.Collections.Generic的命名空间
官方文档:https://learn.microsoft.com/zh-cn/dotnet/csharp/
非泛型容器
ArrayList
ArrayList本质就是一个可以动态扩容的是object数组,使用值类型存储的时候就存在装箱,取出来的时候就存在拆箱,所以尽量用list等泛型容器存,他的优点就是可以存不同类型的元素。
申明:ArrayList array = new ArrayList()
在容器尾部增加:array.Add(value)
在容器最后批量增加(参数可以填另一个arraylist):array.AddRange(array2)
容器中插入:array.Insert(index, value)
移除指定元素,从头找到就删:array.Remove(value)
移除指定位置的元素:array.RemoveAt(index)
清空:array.Clear()
改指定index的元素:array[index] = value
查指定index的元素:array[index]
查看元素是否存在:array.Contains(value)
正向查找元素的index:array.IndexOf(value)
逆向查找元素的index:array.LastIndexOf(value)
长度:array.Count
容量:array.Capacity
遍历:for循环遍历、迭代器遍历
Stack
栈是一种先进后出的数据结构,本质是一个object[]数组封装了特殊的存储规则的容器
申明:Stack stack = new Stack();
进栈:stack.Push(value)
出栈:stack.Pop(value)
查栈顶元素:stack.Peek()
元素是否在栈中:stack.Contains(value)
清空:stack.Clear()
长度:stack.Count
从栈顶到栈底遍历:迭代器遍历,ToArray转成object数组后再用for循环遍历
Queue
队列是一种先进先出的数据结构,本质是一个object[]数组封装了特殊的存储规则的容器
申明:Queue queue = new Queue();
入队:queue.Enque(value)
出队:queue.Deque(value)
查队头元素:queue.Peek()
元素是否在队列中:queue.Contains(value)
清空:queue.Clear()
长度:queue.Count
从队头到队尾遍历:迭代器遍历,ToArray转成object数组后再用for循环遍历
HashTable
Hash表是基于键值对组织的容器,拥有比较高的查询效率,通过key来访问集合中的value
申明:Hashtable hashtable = new Hashtable();
增:hashtable.Add(key,value),注意不能出现相同的key
删:hashtable.Remove(key)
清空:hashtable.Clear()
通过键来查值:hashtable[key],找不到返回空
查看键是否存在:hashtable.Contains(key) 或者 hashtable.ContainsKey(key)
查看值是否存在:hashtable.ContainsValue(value)
通过键修改值:hashtable[key] = value
键值对对数:hashtable.Count
遍历:foreach配合hashtable.Keys/hashtable.Values/hashtable遍历,迭代器遍历
泛型容器
List
List本质是一个可变类型的泛型动态扩容的数组,除了是泛型的其他和ArrayList几乎一模一样
申明:List
在容器尾部增加:list.Add(value)
在容器最后批量增加(参数可以填另一个list):list.AddRange(array2)
容器中插入:list.Insert(index, value)
移除指定元素,从头找到就删:list.Remove(value)
移除指定位置的元素:list.RemoveAt(index)
清空:list.Clear()
改指定index的元素:list[index] = value
查指定index的元素:list[index]
查看元素是否存在:list.Contains(value)
正向查找元素的index:list.IndexOf(value)
逆向查找元素的index:list.LastIndexOf(value)
长度:list.Count
容量:list.Capacity
遍历:for循环遍历、迭代器遍历
Dictionary
Dictionary本质是一个可变类型的泛型HashTable,除了是泛型的其他和Hashtable几乎一模一样
申明:Dictionary <type, type> dictionary = new Dictionary <type,type>();
增:dictionary.Add(key,value),注意不能出现相同的key
删:dictionary.Remove(key)
清空:dictionary.Clear()
通过键来查值:dictionary[key],找不到报错
通过键来查值,找不到返回null:dictionary.TryGetValue( key, out value)
查看键是否存在:dictionary.Contains(key) 或者 hashtable.ContainsKey(key)
查看值是否存在:dictionary.ContainsValue(value)
通过键修改值:dictionary[key] = value
键值对对数:dictionary.Count
遍历(不推荐使用,遍历推荐使用list):C# Dictionary 的几种遍历方法
LinkedList
LinkedList本质是一个可变类型的泛型双向链表,链式存储在增、删的性能高于顺序存储,因为不需要像顺序存储一样去移动位置,查、改的性能链式存储低于顺序存储,因为链表需要遍历访问,而顺序表可以通过下标直接访问。
申明:LinkedList
在容器尾部增加:linkedList.AddLast(value)
在容器头部增加:linkedList.AddFirst(value)
在指定结点后增加一个结点:linkedList.AddAfter(node, value ),配合Find使用
在指定结点前增加一个结点:linkedList.AddBefore(node, value ),配合Find使用
移除头结点:linkedList.RemoveFirst()
移除尾结点:linkedList.RemoveLast()
移除指定值的结点:linkedList.Remove(value)
清空:linkedList.Clear()
查看头结点:linkedList.First
查看尾结点:linkedList.Last
查看指定值的结点:linkedList.Find(value),找不到返回空,返回LinkedListNode
查看值是否存在:linkedList.Contains(value)
修改值:node.Value = value,先要得到结点然后再修改
遍历:迭代器遍历,获取头结点然后node.Next向后遍历或者获取尾结点然后node.Previous向前遍历
泛型Stack和Queue
申明:Stack
方法:和非泛型的完全一致,泛型不会产生装箱拆箱,所以工作中几乎很少使用非泛型的容器