1、列表:泛型类List
该类实现了IList、ICollection、IEnumerable、IList、ICollection和IEnumerable接口。
- 1、创建列表:元素添加到列表中,如果列表的容量不够,就会将列表的容量重新设置为原来的2倍;
var intList = new List<int>(); //Racer是一个类,包含5个属性int id,string firstname,string lastname,string country,int wins var racers = new List<Racer>();
- Capacity属性:可以获取和设置集合的容量;
- Count属性:获取集合中元素的个数;
- TrimExcess()方法:如果已经将元素添加到列表中,且不需要添加更多的元素,调用该方法去除掉不需要的容量。但是,如果元素个数超过了容量90%,该方法就没有用了。
- 2、集合初始值设定:在初始化集合时,在花括号中给集合赋值;
var intList = new List<int>() { 1, 2 }; var racers = new List<Racer>() { new Racer(3, "a", "b", "c", 10) };
3、列表添加元素:Add()方法添加单个元素和AddRange()方法添加多个元素;
//Add()方法添加单个元素 var intList = new List<int>(); intList.Add(4); var racers = new List<Racer>(); racers.Add(new Racer(6, "f", "g", "s", 50)); //AddRange()方法添加多个元素 racers.AddRange(new Racer[] { new Racer(8,"f","g","d",10), new Racer(9,"r","f","j",88) });
4、插入元素:Insert()方法可以在指定位置插入单个元素,InsertAange()方法提供了在指定位置插入大量元素的功能;
racers.Insert(2, new Racer(11, "d", "g", "o", 99)); racers.InsertRange(1, new Racer[] { new Racer(80,"f","g","d",34), new Racer(90,"r","f","j",5) });
5、访问集合中的元素:实现了IList和IList接口的所有类都提供了一个索引器,可以通过索引器来访问其中的元素;
for (int i = 0; i < racers.Count; i++) { WriteLine(racers[i]); } //List<T>集合实现了IEnumerable接口。可以使用foreach语句 foreach (var racer in racers) { WriteLine(racer); }
6、删除集合中的元素:RemoveAt()方法按照索引删除元素,Remove()方法直接删除元素(过程:用IndexOf()获取元素索引,再使用索引删除元素)RemoveRange()方法可以从集合中删除许多元素(第一个参数指定了开始删除的元素索引,第二个参数指定了要删除的元素个数)
- 7、搜索:可以搜索元素的索引,也可以搜索元素本身。常用的方法有IndexOf(),LastIndexOf(),FindIndex(),FindLastIndex(),Find()和FindLast()。
- 8、排序:使用Sort()方法对元素进行排序。Sort()方法使用快速排序算法,比较所有的元素,直到整个列表排好序为止。Sort()方法使用了几个重载的方法,传递的参数可以是泛型委托Comparison和泛型接口IComparer,以及一个范围值和泛型接口IComparer;
//集合中的元素实现了IComparable接口,才能使用不带参数的Sort()方法; public void List<T>.Sort(); public void List<T>.Sort(Comparison<T>); public void List<T>.Sort(IComparer<T>); public void List<T>.Sort(Int32, Int32, IComparer<T>);
2、只读集合
创建集合后,它们就是可读写的,但是,在填充完集合后,可以创建只读集合,此时,只要调用AsReadOnly()方法。
3、队列
队列是其元素以先进先出(FIFO)的方式来处理的集合。使用泛型类Queue来实现。该类实现了ICollection和IEnumerable接口,但是,没有实现ICollection接口,所以不能使用Add()和Remove()方法,也没有实现IList接口,所以不能用索引器访问队列。
Queue类的成员 说明 Count 返回队列中的元素个数 Enqueue 在队列的一端添加一个元素 Dequeue 在队列的头部读取和删除元素,如果调用该方法时,队列中没有元素,抛出InvalidOperationException异常 Peek 从队列的头部读取一个元素,但不删除它 TrimExcess 重新设置队列的容量
4、栈
栈是一个先进后出(LIFO)的容器。使用泛型类Stack,实现了IEnumerable和ICollection接口。
Stack类的成员 说明 Count 返回栈中元素的个数 Push 在栈顶添加一个元素 Pop 从栈顶删除一个元素,并返回该元素。如果栈是空的,抛出InvalidOperationException异常 Peek 返回栈顶的元素,但不删除它 Contains 确定某个元素是否在栈中,如果是,就返回true
5、链表LinkedList
LinkedList是一个双向链表,其元素指向它前面和后面的元素。这样一来,通过移动到下一个元素可以正向遍历整个链表,通过移动到前一个元素可以反向遍历整个链表。
LinkedList类定义了一些成员和方法,对元素进行操作:
- First和Last:访问链表中的第一个和最后一个元素;
- AddAfter()、AddBefore()、AddFirst()和AddLast()方法:在指定的位置插入元素;
- Remove()、RemoveFirst()和RemoveLast()方法:删除指定位置的元素;
- Find():从链表的开头开始搜索元素;
- FindLast():从链表的结尾开始搜索元素。
6、链表的优缺点
优点:
- 1、插入元素的效率高。如果将元素插入列表的中间位置,使用链表就会非常快。在插入一个元素时,只需要修改上一个元素的Next引用和下一个元素的Previous引用,使它们引用所插入的元素。
缺点:- 1、查找特定元素的效率低。链表的元素只能一个接一个的访问,需要较长的时间来查找位于链表中间或尾部的元素。
- 2、链表不能再列表中近存储元素。存储元素时,链表还必须存储每个元素的下一个元素和上一个元素的信息。这时,使用LinkedListNode的属性List、Next
、Previous和Value。
- [List属性]:返回与节点相关的LinkedList对象;
- [Next和Previous属性]:用于遍历链表,访问当前节点之后和之前的节点;
- [Value属性]:返回与节点相关的元素,类型是T;
7、有序列表
基于键对所需集合排序,可以使用SortedList