C# list集合 重复元素 索引_编写高质量代码的100个建议16(选择正确的集合)

7f65c4dfe68580413a5dd4d80244bceb.png

选择正确的集合

前言

            要选择正确的集合,首先需要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。

            线性集合按存储方式又分为直接存储和顺序存储。所谓直接存储,是指该类型的集合数据元素可以直接通过下标(即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>();

主要集合类

89f162852c6ef6960a458faad4fa68f3.png

01d6a9b427d56d5137370d2528d67ea9.png

写在最后

选择合适集合有助于写出高质量的代码,加快程序的运行速度,每天一文章,记录学习心得,感谢关注!


54a1b2bcd238964bd66f4124c69fa55b.png


8d610004796a2d7402f8f55f362cfa6e.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值