C# 集合
- 集合
- 集合接口和类型
- 列表
- 队列
- 栈
- 链表
- 有序表
- 字典
- Loopup
- HashSet
- 位数组
集合
数组的大小是固定的。如果元素个数是动态的,就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。
集合接口和类型
集合类可以组合为集合,存储 Object 类型的元素和泛型集合类。
对象类型的集合位于 System.Collections 命名空间;泛型集合类位于 System.Collections. Generic
命名空间;专用于特定类型的集合类位于 System.Collections.Specialized 命名空间。
列表
.NET Framework 为动态列表提供了类 ArrayList 和 List。。System.Collections.Generic 命名空间中的类 List的用法非常类似于 System.Collections 命名空间中的 ArrayList 类。
ArrayList objectList = new ArrayList();
List intList = new List();
List racers = new List();
intList.Add(1);
intList.Add(2);
队列
队列是其元素以先进先出(FIFO)的方式来处理的集合。在.NET 的 System.Collections 命名空间中有非泛型类 Queue,在 System.Collections.Generic 命名空间中有泛型类 Queue。这两个类的功能非常类似,但泛型类是强类型化的,定义了类型 T,而非泛型类基于 Object 类型。
栈
栈是与队列非常类似的另一个容器,只是要使用不同的方法访问栈。最后添加到栈中的元素会最先读取。栈是一个后进先出(LIFO)容器。与 Queue 类相同,非泛型类 Statck 也执行了 ICollection、IEnumerable 和 ICloneable 接口;泛型类Statck实现了 IEnumerable、ICollection 和 IEnumerable 接口。用 Push()方法在栈中添加元素,用 Pop()方法获取最近添加的元素。
Stack alphabet = new Stack();
alphabet.Push(‘A’);
alphabet.Push(‘B’);
链表
LinkedList 集合类没有非泛型集合的类似版本。LinkedList 是一个双向链表,其元素指向它前面和后面的元素。
有序表
如果需要排好序的表,可以使用 SortedList<TKey, TValue>。这个类按照键给元素排序。
字典
字典表示一种非常复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List,但没有在内存中移动后续元素的性能开销。
创建一个新的 Dictionary<TKey, TValue>实例;
可以使用 Dictionary<TKey, TValue>类的索引器替代 TryGetValue()方法,来访问存储在字典中
的值;
Loopup
Dictionary<TKey, TValue>只为每个键支持一个值。新类 Lookup<TKey, TElement>是.NET 3.5 中新增的,它类似于 Dictionary<TKey, TValue>,但把键映射到一个值集上。这个类在程序集System.Core中实现,用 System.Linq 命名空间定义。
HashSet
System.Collections.Generic 命名空间中包含一个新的集合类:HashSet。这个集合类包含不重复项的无序列表。这种集合称为"集(set)"。
位数组
如果需要处理许多位,就可以使用类 BitArray 和结构 BitVector32。BitArray 位于命名空间System.Collections,BitVector32 位于命名空间 System.Collections.Specialized。这两种类型最重要的区别是,BitArray 可以重新设置大小,如果事先不知道需要的位数,就可以使用 BitArray,它可以包含非常多的位。BitVector32 是基于栈的,因此比较快。BitVector32 仅包含 32 位,存储在一个整数中。
static void DisplayBits(BitArray bits)
{
foreach (bool bit in bits)
{
Console.Write(bit ? 1 : 0);
}
}
BitArray bits1 = new BitArray(8);
bits1.SetAll(true);
bits1.Set(1, false);
bits1[5] = false;
bits1[7] = false;
Console.Write("initialized:");
DisplayBits(bits1);
Console.WriteLine();