C#Dictionary使用记录
一、区别
在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,其区别和优劣势为:
初始化
数组:
int[] buff = new int[6];
ArrayList:
ArrayList buff = new ArrayList();
List:
List<int> buff = new List<int>();
Dictionary:
Dictionary<int,string> buff = new Dictionary<int,string>;
分析比较
从上面初始化的几种类型可以看出,他们都属于引用类型。其中数组、List、Dictionary在初始化的时候需要指定其元素类型,而ArrayList不需要指定类型。而在其中只有数组在初始化时设置了其大小。
数组:在初始化时必须指定其大小和类型,他在内存中是连续存储的,所以可以看出数组的索引速度是非常快的。在确定了数组的长度和类型后,选择数组存储数据是比较好的选择。不适合插入操作。
ArrayList:在初始化的时候不需要指定其大小和类型。他可以存储不同的数据类型,但是在存取得过程中会引起装箱和拆箱,降低了性能。插入操作方便。
List:在初始化的时候必须指定其类型,但是不需要指定大小,所以他不会像ArraryList那样在存取过程中引起装箱和拆箱操作。在类型相同的情况下,List和数组的性能相当。插入操作方便。
Dictionary:在初始化的时候也必须指定其类型,而且他还需要指定一个Key,并且这个Key是唯一的。正因为这样,Dictionary的索引速度非常快。但是也因为他增加了一个Key,Dictionary占用的内存空间比其他类型要大。他是通过Key来查找元素的,元素的顺序是不定的。下图比较列表

二、目前我的使用
1.目前我用于接口中返回移动端所需要的数据,一般是先把数据放在DataTable中,然后再把DataTable放在Dictionary中,例如:
{
"result_status": true,
"result_msg": "请求成功",
"result_data": [{
"UserName": "推送测试",
"Signer": ,
"Finish": ,
"Options": "",
"SealWord": "A",
"SignDate": "",
"Sign": ,
"Flow": ,
"EnableSign":
}]
}
2.后来Dictionary发现能放各种东西,而且是啥都能放,,,,于是开始往里面嵌套Dictionary
3.深入研究后需要往DataTable里插入信息,于是研究出先把DataTable转成Dictionary再遍历Dictionary再插入信息,还是先放转Dictionary方法吧
/// <summary>
/// 转换Datatable为List<Dictionary<string, object>>
/// </summary>
/// <param name="dt">Datatable</param>
/// <returns></returns>
public static List<Dictionary<string, object>> ConvertToListDictionary(DataTable dt)
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
dic.Add(dc.ColumnName, dr[dc.ColumnName]);
}
list.Add(dic);
}
return list;
}
然后遍历一下:就可以往里面放信息了
foreach (var x in listdicData)
{
dt2 = DbHelperSQL.Query(sql2 + x["Id"] + orderBy2).Tables[];
x.Add("data_Detail", dt2);
}
放个效果例子吧还是:
{
"result_status": true,
"result_Type": "总的合同付款审批台账",
"result_msg": "请求成功",
"result_data": {
"data_listMain": [{
"Id": ,
"AddDate": "2018-06-14T17:29:02.887",
"AddUserId": ,
"ContractNum": "",
"ContractAndName": "第二合同",
"BargainMoney": 3000.00,
"ContractXDMan": "",
"BargainSignDate": "",
"BargainFile": "",
"FilesCount": 222.0,
"SYmoney": 2778.0,
"data_Detail": [{
"Id": ,
"Issue": "第5期",
"Finish": "审批中"
}, {
"Id": ,
"Issue": "第6期",
"Finish": "审批中"
}]
}, {
"Id": ,
"AddDate": "2018-06-14T18:11:00.607",
"AddUserId": ,
"ContractNum": "",
"ContractAndName": "第一合同",
"BargainMoney": 200.00,
"ContractXDMan": "",
"BargainSignDate": "",
"BargainFile": "",
"FilesCount": 222.0,
"SYmoney": -22.0,
"data_Detail": [{
"Id": ,
"Issue": "第4期",
"Finish": "审批完"
}]
}],
"data_count":
}
}
emm还有什么呢?后面再补充吧~
最后附加一个:Word转Pdf方法(官方原生态方法,效果非常好)吧https://www.cnblogs.com/ggll611928/p/9019439.html
C#Dictionary使用记录的更多相关文章
- 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据
参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...
- 面向对象编程笔记--static
通过static方法,提供静态的不需要实例化即可访问的方法或属性.所有的调用者可以使用同一个类(不实例化)或对象(只实例化一次),可以应用的场景: 1)各个调用者共享数据,协同工作. 2)对象只可以实 ...
- parquet列式文件实战
前言 列式文件,顾名思义就是按列存储到文件,和行式存储文件对应.保证了一列在一个文件中是连续的.下面从parquet常见术语,核心schema和文件结构来深入理解.最后通过java api完成writ ...
- 共享表空间VS独立表空间
基础概念:共享表空间 VS 独立表空间 [共享表空间] 又称为system tablespace系统表空间,a small set of data files (the ibdata files) . ...
- MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例
上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面 ...
- Lecture 2
1. Coordinate(坐标) data for GIS real coordinate system:Cartesian coordinate systems(笛卡尔坐标系) from 3D t ...
- Elastic Search中normalization和分词器
为key_words提供更加完整的倒排索引. 如:时态转化(like | liked),单复数转化(man | men),全写简写(china | cn),同义词(small | little)等. ...
- oracle数据字典视图
数据字典的概念 还记得我们在手工建库的时候,运行的两个脚本文件.一个是catalog.sql,另一个是catproc.sql.catalog.sql是用来创建数据库的内部字典表的.catp ...
- 【转】Elasticsearch学习笔记
一.常用术语 索引(Index).类型(Type).文档(Document) 索引Index是含有相同属性的文档集合.索引在ES中是通过一个名字来识别的,且必须是英文字母小写,且不含中划线(-):可类 ...
随机推荐
- 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用
什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即"通用输入输出". Raspberry Pi 有两行 GPIO 引脚, Rasp ...
- Spring线程池配置模板设计(基于Springboot)
目录 线程池配置模板 基础的注解解释 常用配置参数 配置类设计 线程池使用 ThreadPoolTaskExecutor源码 线程池配置模板 springboot给我们提供了一个线程池的实现,它的底层 ...
- Camstar MES 5.8 發現Ajax事件失效
從Camstar4.5升級到5.8後,發現原來用戶在4.5下可以正常使用的不良信息收集功能,列出的不良只有第一頁可以顯示,無法自動裝載下一頁. 嘗試發出,IE以下這個選項沒有選中,選中後,就可以正常工 ...
- cpu的核心数及线程关系
CPU个数.核心数.逻辑CPU个数:一个物理CPU可以有多个核心,一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥 ...
- sed 指定行范围匹配(转)
sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...
- BZOJ3236:[AHOI2013]作业(莫队,分块)
Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...
- 借助强大的IDEA开发ide高效实现equals,hashcode以及toString方法
IDEA工具提供多种生成hashCode与equals的代码方案,注意:尽量不要使用第一个方案,第一个方案对于null不做判空处理,容易NNP问题. 对于生成toString方法方案,默认使用的是+拼 ...
- pip install Yellowfin失败的问题
上面的方法简单有效 https://blog.csdn.net/quqiaoluo5620/article/details/80608474
- Controller中添加一个异步的Action
给一段示例代码: public Task<ActionResult> TbReport(string code) { return Task.Factory.StartNew(() =&g ...
- STM32驱动ILI9341控制器控制TFTLCD显示
STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...