选择正确的集合
前言
要选择正确的集合,首先需要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。
线性集合按存储方式又分为直接存储和顺序存储。所谓直接存储,是指该类型的集合数据元素可以直接通过下标(即index)来访问,在C#中直接存储的数据结构有三类: Array (包括数组和List)、string、 struct。直接存储结构的优点是:向数据结构中添加元素是很高效的,直接放在数据末尾的第一个空位上就可以了。它的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。
注意,string 和struct虽然是直接存储结构,但它们与一般的集合定义有很大的不同,所以不在本建议的讨论范围之内。在直接存储的数据结构中,需要区分的是数组List的选择。再次强调一下:如果集合的数目固定并且不涉及转型,使用数组效率高,否则就使用List。顺序存储结构,即线性表。线性表可动态地扩大和缩小,它在一片连续的区域中存储数据元素。线性表不能按照索引进行查找,它是通过对地址的引用来搜索元素的,为了找到某个元素,它必须遍历所有元素,直到找到对应的元素为止。所以,线性表的优点是插入和删除数据效率高,缺点是查找的效率相对来说低一些。线性表又可以分为队列、栈及索引群集,在C#中分别表现为: Queue,Stack,索引群集又进一步泛化为字 典类型Dictionary和双向链表LinkedList 。队列Queue遵循的是先入先出的模式,它在集合末尾添加元素,在集合的起始位置删除元素。
字典Dictionary存储的是键值对,值在基于键的散列码的基础上进行存储。字典类对象由包含集合元素的存储桶组成,每--个存储桶与基于该元素的键的哈希值关联。如果需要根据键进行值的查找,使用Dictionary将会使搜索和检索更快捷。双向链表LinkedList是-一个 类型为LinkedListNode 的元素对象的集合。当我们觉得在集合中插入和删除数据很慢时,就可以考虑使用链表。如果使用LinkedList,我们会发现此类型并没有其他集合普遍具有的Add方法,取而代之的是AddAfter、AddBefore、AddFirst、AddLast等方法。双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。以上讨论了线性集合,在FCL中,非线性集合实现得不多。非线性集合分为层次集合和组集合。层次集合(如树)在FCL中没有实现。组集合又分为集和图,集在FCL中实现为HashSet,而图在FCL中也没有对应的实现。集的概念本意是指存放在集合中的元素是无序的且不能重复的。到此为止本建议已经介绍了FCL中大部分的泛型集合类,为了对它们有更好的了解,在实际工作中,应该根据需要选择合适的集合类。
代码示例
数组:可结合此文章 C# 数组
//1:显式初始化 //int[] array = new int[5]; ////2:隐式初始化 //var array2 = new int[5]; ////3:初始化值 //int[] array3 = new int[] { 1, 2, 3 }; ////4:显式简单初始化 //int[] array4 = new[] { 1, 2, 3, 4, 5 }; ////5: 隐式简单初始化 //var array5 = new[] { 1, 2, 3, 4, 5 }; //交错数据 //int[][] arr = new int[3][] { new int[3] { 5, 6, 2 }, new int[5] { 6, 9, 7, 8, 3 }, new int[2] { 3, 2 } }; //Console.WriteLine(arr[2][2]);//超出索引 //交错数据 int[][] arr = new int[3][] { new int[3] { 5, 6, 2 }, new int[5] { 6, 9, 7, 8, 3 }, new int[2] { 3, 2 } }; //二维数组 int[,] arrv2 = new int[3, 2] { { 1, 2 }, { 2, 2 }, { 3, 3 } }; //三维数组 int[,,] arrv3 = new int[3, 3, 3] { { { 1, 2, 3}, { 1, 2, 3 }, { 1, 2, 3 } }, { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }, { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } } };
动态数组
ArrayList al = new ArrayList(); //动态数组,不连续 类型不确定 便于插入 有拆箱装箱的性能损耗 al.Add(1); al.Add("1");
SortedList有序列表
SortedList<string, string> slist = new SortedList<string, string>(); List<string> list = new List<string>();//类型安全 底层是Array 可变长度 list.Add("1");
先进先出队列 FIFO 队列
Queue qu = new Queue();//先进先出 FIFO 队列 qu.Enqueue("1"); qu.Enqueue(1); qu.Dequeue();
后进先出 LIFO 堆
Stack sta = new Stack();//后进先出 LIFO 堆 sta.Push("1"); sta.Push(1); sta.Pop(); sta.Peek();
键值对 字典
Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("", ""); SortedDictionary<string, string> sdic = new SortedDictionary<string, string>();
主要集合类
写在最后
选择合适集合有助于写出高质量的代码,加快程序的运行速度,每天一文章,记录学习心得,感谢关注!