C# Dictionary的遍历理解
C# Dictionary容器类的理解
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/52490249
作者:cartzhang
一、Dictionary容器类的内部实现
在C#中,Dictionary 是一个键值对应。每个Key在字典内都是唯一的。也就是说所有键值都是唯一的一对。
他们都需要继承IDictionary<K,V>()类,当然IDictionary<K,V>()继承与Collection<KeyValuePair<K,V>>,
而它ICollection<KeyValuePair<K,V>>()继承与IEnumerable类。
二、Dictionary的迭代
Dictionary < TKey, TValue > Class 的迭代方式有两种:
1. foreach
foreach (KeyValuePair item in myDictionary)
{
MessageBox.Show(item.Key + " " + item.Value);
}
2.for 循环
for (int count = 0; count < myDictionary.Count; count++)
{
var element = myDictionary.ElementAt(count);
var Key = element.Key;
var Value = element.Value;
MessageBox.Show(Key + " " + Value);
}
三、相关容器类
1.Class Dictionary<K,V>
基于hash table.
2.SortedDictionary<K,V>
基于二叉树搜索
3.SortedList<K,V>
基于排序的Collection。
他们之间的算法复杂度比较:
作为colletion容器类,Dictionary还是表现特别良好的。
4、Dictionary 与List比较
执行效率对比:
与List相对比:Dictionary的O(n)是固定的。而list随长度增加。
五、Dictionary的迭代方法对比
Foreach的迭代方法有三种:
Dictionary<double, double>.ValueCollection valueColl = randomDictionaryOfDoubles.Values;
一个是KeyValuePair
foreach (KeyValuePair<double, double> kvp in randomDictionaryOfDoubles)
{
total += (kvp.Value);
}
一个是ValueCollection
foreach (double d in valueColl)
{
total += d;
}
一个是keyCollection
foreach (double d in keyColl)
{
total += d;
}
这个很明显的就是效率问题:通过KeyCollection遍历效率高于ValueCollection的遍历效率,而ValueCollection的遍历效率高于key-ValuePairs。
简而言之:keyCollection > ValueCollection>key-valuePairs.
各位可以斟酌使用啊。
六、关于GC
因为在项目中,有同学使用Dictionary过程中,Foreach的过程中,
有GC。到底在遍历过程中会不会产生很多GC呢?还是我们的使用方法不对呢?所以让我帮忙看下。
正好看下GC的流程。
最好的问题,个人觉得应该是Unity的.Net 对应版本比较低,造成优化比较不好的问题。
这个在接下来,我会简单比较下。
先回去睡觉了。就这样。
参考:
1. http://csharp.net-informations.com/collection/dictionary.htm
2. http://net-informations.com/q/faq/dictionary.html
3. http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections_themes-dictionary-sect.html
4. http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections_themes-list-sect.html#collections_collection-overview-1_svg-image_i1
5. http://alexpinsker.blogspot.com/2010/02/c-fastest-way-to-iterate-over.html
6. http://www.cnblogs.com/jeffwongishandsome/p/talk-about-GC-and-how-to-use-GC-better.html
——————-THE———–END————————–
若有问题,请随时联系!!!
非常感谢!!!
梦想有个车!!
人想法还是要有的!!!
C# Dictionary的遍历理解的更多相关文章
- c# Dictionary的遍历和排序
c# Dictionary的遍历和排序 c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 ...
- c# Dictionary的遍历和排序(转)
c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 foreach: 需要实现ienume ...
- Dictionary的遍历和修改
/// <summary> /// 初始化一个Dic /// </summary> public static void mainTe ...
- python dictionary的遍历
d = {'x':1, 'y':3, 'z':2} for k in d: print d[k] 直接遍历k in d的话,遍历的是dictionary的keys. 2 字典的键可以是任何不可变 ...
- (小常识)Dictionary的遍历
Dictionary<int, string> objDictionary = new Dictionary<int, string>(); ...
- Dictionary的遍历
Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("d", 1) ...
- js dictionary字典 遍历
var dic={A:"AA",B:"BB",C:"CC"} //不能length去for循环(length:undefined) dic[ ...
- C# Dictionary的遍历
foreach (KeyValuePair<string, string> kvp in dic) { Console.WriteLine("key:{0},value:{1}& ...
- .net源码分析 – Dictionary<TKey, TValue>
接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...
随机推荐
- selenium鼠标拖动
var builder = new Actions(_driver); builder.MoveToElement(_driver.GetElementByCssSelector("#com ...
- Azure进阶攻略 | 该如何唤醒你?因内核超时而沉睡的Linux虚拟机!
周五下午,当你收拾好东西准备下班,奔赴 Happy Hour 时,突然接到开发团队的电话: 对方:伙计救命啊,我在搭建开发环境,但 Azure 上的 Linux 虚拟机无法启动! 你(心里想着:你要加 ...
- megacli使用
查看raid类型 /opt/RAID/MegaCli64 -ShowSummary -a0 System Operating System: Linux version 2.6.32-220.el6. ...
- 01、Spark安装与配置
01.Spark安装与配置 1.hadoop回顾 Hadoop是分布式计算引擎,含有四大模块,common.hdfs.mapreduce和yarn. 2.并发和并行 并发通常指针对单个节点的应对多个请 ...
- ubuntu linux 使用命令行安装 google chrome
原帖地址: https://www.cyberciti.biz/faq/how-to-install-google-chrome-in-ubuntu-linux-12-xx-13-xx/ $ wget ...
- 关于硬盘分区使用exFat格式的优势及劣势(含摘抄)
优势 可以设置最大32M的簇: 不记录日志. 劣势 无法使用windows的“文件共享”: 通过近期某个文件数量密级任务的测试发现,在大量文件的处理性能上,NTFS比exFAT文件系统的性能高出不少. ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)
点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...
- 【转】你是不是也被Android Private Libraries、Referenced Libraries、android Dependency搞晕了~~
一.v4.v7.v13的作用和用法 1.Android Support V4, V7, V13是什么? 本质上就是三个java library. 2.为什么要有support库? 是为了解决软件的 ...
- Java nio socket与as3 socket(粘包解码)连接的应用实例
对Java nio socket与as3 socket连接的简单应用 <ignore_js_op>Java nio socket与as3 socket连接的应用实例.rar (9.61 K ...
- 2017.11.15 JavaWeb的学生体质管理系统
(11)案例-----学生身体体质信息管理系统的开发 11.1 功能划分: 1.添加记录模块:完成向数据库添加新纪录 2.查询记录模块:完成将数据库的记录以网页的方式显示出来,一般采用有条件的查询 3 ...