非泛型容器需要引入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 = new 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 = new 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 stack = new Stack();Queue queue = new Queue ();

方法:和非泛型的完全一致,泛型不会产生装箱拆箱,所以工作中几乎很少使用非泛型的容器