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的遍历理解的更多相关文章

  1. c# Dictionary的遍历和排序

    c# Dictionary的遍历和排序 c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 ...

  2. c# Dictionary的遍历和排序(转)

    c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 foreach: 需要实现ienume ...

  3. Dictionary的遍历和修改

    /// <summary>        /// 初始化一个Dic        /// </summary>        public static void mainTe ...

  4. python dictionary的遍历

    d = {'x':1, 'y':3, 'z':2} for k in d:    print d[k] 直接遍历k in d的话,遍历的是dictionary的keys. 2 字典的键可以是任何不可变 ...

  5. (小常识)Dictionary的遍历

                Dictionary<int, string> objDictionary = new Dictionary<int, string>();       ...

  6. Dictionary的遍历

    Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("d", 1) ...

  7. js dictionary字典 遍历

    var dic={A:"AA",B:"BB",C:"CC"} //不能length去for循环(length:undefined) dic[ ...

  8. C# Dictionary的遍历

    foreach (KeyValuePair<string, string> kvp in dic) { Console.WriteLine("key:{0},value:{1}& ...

  9. .net源码分析 – Dictionary<TKey, TValue>

    接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...

随机推荐

  1. lucene的使用与优化

    1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工 ...

  2. Azure 本月最新活动,速度Mark!

    很多时候,为了知晓 Azure 相关活动的信息,需要到处查阅.问朋友同事,这样既麻烦又易造成延误.为方便广大粉丝,我们推出每月活动合集,帮您第一时间了解 Azure 最新活动,还等什么,一起来看吧! ...

  3. [topcoder]SRM 633 DIV 2

    第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...

  4. 光标显示样式 css 中 cursor 属性使用

    记录一下 cursor 的各种样式,方便自己查找.之前用到不常用的每次去 百度 或 Google 找不如自己记录下好找些. cursor光标类型 auto default none context-m ...

  5. 笨办法学Python(二十)

    习题 20: 函数和文件 回忆一下函数的要点,然后一边做这节练习,一边注意一下函数和文件是如何在一起协作发挥作用的. from sys import argv script, input_file = ...

  6. 从HTTP响应头判断是否命中CDN

    腾讯云: X-Cache-Lookup:Hit From MemCache 表示命中CDN节点的内存X-Cache-Lookup:Hit From Disktank 表示命中CDN节点的磁盘X-Cac ...

  7. Node.js与npm安装(转载)

    2009年的JSCOnf大会上,一个叫Ryan Dahl的年轻程序员向人们展示了一个他正在做的项目,一个基于Google V8引擎的JavaScript运行平台,它提供了一套事件循环和低IO的应用程序 ...

  8. Selenium入门系列1 打开浏览器访问网页,退出浏览器

    对于功能自动化的理解就是用测试工具替代手工.手工怎么操作的,工具也如何操作. 手工测试:在前置条件下,执行一定的操作步骤>与预期结果对比 功能自动化:在前置条件下,识别对象 >操作对象&g ...

  9. 好的学习网站和app推荐

    1  W3cschool: http://www.w3school.com.cn/ 菜鸟教程: http://www.runoob.com/ 2 视频学习网站和app:网易云课堂.腾讯课堂.慕课网(h ...

  10. 【PHP 模板引擎】Prototype 原型版发布!

    在文章的开头,首先要向一直关注我的人说声抱歉!因为原本是打算在前端框架5.0发布之后,就立马完成 PHP 模板引擎的初版.但我没能做到,而且一直拖到了15年元旦才完成,有很严重的拖延症我很惭愧,再次抱 ...