List和Dictionary想必是我们平常用到最多的C#容器了,他们使用起来都很简单,所以很多人就可能就没去深究,其实在使用过程中有很多的小技巧能让我们写的代码变得更高效也更安全。

1·合理的指定初始容量。

List和Dictionary的构造函数都有一个入参为int的构造函数:public Dictionary(int capacity);和public List(int capacity);。capacity用来指定List和Dictionary的初始容量。这步操作有什么用呢?是这样的,List和Dictionary的内部实现方式都是使用数组,因为数组的容量是固定的,所以初始化的时候就会对其申请内存,List的默认大小为4,Dictionary的默认大小为3。也就是说如果不指定初始化容量的,系统会给你默认创建。当你往容器里Add数据时,如果当前数组已满,则新创建一块两倍于当前数组长度的内存,把原有数据copy到新内存中,再继续往里添加。例如你创建一个没指定初始容量的List后,依次往里面添加了10个元素,内存是这样分配的:首先默认分配了一块长度为4个List元素的内存给List数组,当添加到第五个时,发现长度已然不足,所以分配4*2=8的内存,把原有的4个数据拷贝到新内存块中并把第五个元素添加到末尾,当添加到第九个时,同第五个的操作一样,所以最终List数组的长度为16,里面存放了10个元素,共分配了三次内存,进行了两次的内存拷贝。讲到这,大家应该就很明了了,合理的指定初始容量,可以减少内存的分配和拷贝次数,甚至还能节省内存空间。

2·给Dictionary添加元素时,建议直接用中括号的方式,而不是使用Add方法。

虽然不管是用[]还是Add方法,调用的都是Dictionary的Insert函数,但是区别在于用Add函数的话,如果已经存在同样的键对值,会直接抛出ArgumentException,这意味着后续的代码都不执行了,这可很要命,明明是一个小问题,可看上去可能是一个大Bug。而用中括号属性的方法,如果不存在会添加,如果存在则进行改写,只要key值不为null,是不会抛出异常的。

3·学会使用List的AsReadOnly函数。

如果你有写C++的经历的话,写C#会觉得蛋疼,因为它不允许入参和返回值设置为const。这意味着别人可以随意修改你的入参和返回值,这好难受啊。List有个返回只读的接口:ReadOnlyCollection<T> AsReadOnly()。首先这个类型名称就叫ReadOnly,起到了强烈的提示作用,其次这个类只有Contains、CopyTo、GetEnumerator、IndexOf几个接口,至少防止了使用者在接口层对List进行修改。

4·利用TryGetValue(TKey key, out TValue value)接口获取Dictionary中的数据。

      string GetDictionaryVal(string strkey)
{
if (!dicTest.ContainsKey(strkey))
{
return string.Empty;
} return dicTest[strkey];
}

上面这段代码其实非常正确,但是从效率的角度上看却对dictionary进行两遍的查找:ContainsKey和下标操作各一次。所以我们可以这么写:

      string GetDictionaryVal(string strkey)
{
string strVal = string.Empty;
dicTest.TryGetValue(strkey, out strVal);
return strVal;
}

TryGetValue函数的返回值为bool值,表示是否存在于Dictionary中。

5·编写返回Dictionary或者List的函数时,别返回null,如果没数据可以返回个空的Dictionary或者List,因为如果返回null,上层的代码很容易会对其做foreach时抛出异常。例如:

//纯测试

  List<uint> lstInfo = new List<uint>() { , ,  };
public List<uint> GetLstInfo(bool bSuc)
{
if (!bSuc)
{
return null;
} return lstInfo;
}

有些人会写类似于上面这样的接口,然后上层程序员经常会这样使用它:

foreach (var item in GetLstInfo(true))
    {
 
        }

如果入参为false,那么将返回null,然后foreach时程序就抛出异常了,后续代码无法执行,所以我们可以这样写:

public List<uint> GetLstInfo(bool bSuc)
{
if (!bSuc)
{
return new List<uint>();
} return lstInfo;
}

————————————————
版权声明:本文为CSDN博主「钢与铁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_14914623/java/article/details/104422202

List和Dictionary的使用技巧总结的更多相关文章

  1. C#泛型集合之Dictionary<k, v>使用技巧

    1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) 2.描述 1).从一组键(Key)到一组值(Value) ...

  2. C#泛型集合—Dictionary<K,V>使用技巧

    转载:http://blog.csdn.net/a125138/article/details/7742022 1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collec ...

  3. 转载C#泛型集合—Dictionary<K,V>使用技巧

    1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) 2.描述 1).从一组键(Key)到一组值(Value) ...

  4. python 常用技巧 — 字典 (dictionary)

    目录: 1. python 相加字典所有的键值 (python sum all values in dictionary) 2. python 两个列表分别组成字典的键和值 (python two l ...

  5. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  6. iOS:小技巧(不断更新)

    记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...

  7. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  8. EF查询之性能优化技巧

    上一篇:EF使用CodeFirst方式生成数据库&技巧经验 前言 EF相信大部分同学都已经经常使用了,可是你的查询高效吗? 今天我就以个人使用经验来讲讲在使用EF做查询的时候大家都容易忽略的性 ...

  9. iOS 保持界面流畅的技巧 (转载)

    这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index 演示项目 屏幕显示图像的原理 卡顿产生 ...

随机推荐

  1. C#LeetCode刷题之#66-加一(Plus One)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3684 访问. 给定一个由整数组成的非空数组所表示的非负整数,在该 ...

  2. 悄咪咪提高团队幸福感 & Surprise!

    前言 本文的灵感是在几个月以前工作不忙(摸鱼)时想到的,老是自己一个人往前冲冲冲也没啥意思,需要想一点办法,来提高团队的效率,提高团队的幸福感(效率起来了,单位时间内代码写的更多,那不就幸福啦 ),经 ...

  3. JSONP跨域和CORS跨域的区别

    跨域: 由于浏览器中的javascript的同源策略,同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互. 同源:协议,域名,端口,三者有一个不同即为跨域. 解决跨域有以下多种方法 ...

  4. CSS动画实例:跳跃的字符

    1.翻转的字符 在页面中放置一个类名为container的层作为容器,在该层中放置5个字符区域,HTML代码描述如下: <div class="container"> ...

  5. 可以用命令行控制eclipse断点增加删除、远程调试创建与启动的插件

    java # 创建断点(支持条件断点) curl -X PUT -H "Content-Type:application/json" --data '{"language ...

  6. Docker日常使用方式

    前提 在安装docker之前,建议你设置系统的国内镜像源先哦,很快~嗯,快. 阿里云镜像源:https://developer.aliyun.com/mirror/ 安装 安装docker 下面都是官 ...

  7. eclipse项目文件夹整理

    1.点击倒三角 2.系统默认为Projects,选择第二个working sets 3.点击Configure Working Sets,点new 4.点击后,选中点Add 5.添加一个名字,Fins ...

  8. [转]camera教程

    camera教程 Lens一般由几片透镜组成透镜结构,按材质可分为塑胶透镜(plastic)或玻璃透镜(glass),玻璃镜片比树脂镜片贵.塑胶透镜其实是树脂镜片,透光率和感光性等光学指标比不上镀膜镜 ...

  9. python的各种包安装地址

    http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy-stack 这个网页里有python的所有包,whl的后缀是python压缩包的意思.在windows ...

  10. 牛客网PAT练兵场-人口普查

    题目地址:https://www.nowcoder.com/pat/6/problem/4054 题解:结构体排序即可 /** * Copyright(c) * All rights reserved ...