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类。

sss

二、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————————–
若有问题,请随时联系!!!
非常感谢!!!
梦想有个车!!
人想法还是要有的!!!
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值