关于Dictionary元素的遍历

以前我面试别人的时候,我经常会问应聘者,如何在C#中遍历Hashtable中的元素,每次遍历时,需要得到Key和Value。

一直以来,也经常有人问这个问题。包括Java下Map的元素的遍历。我在水木清华的Java版也回答过这个问题。

.NET平台下:
None.gif IDictionary dictionary  =   new  Hashtable();
None.gif
foreach  (DictionaryEntry entry  in  dictionary)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Object key 
= entry.Key;
InBlock.gif    Object val 
= entry.Value;
ExpandedBlockEnd.gif}

Java环境下:
None.gif Map map  =   new  HashMap();
None.gifIterator iter 
=  map.entrySet().iterator();
ExpandedBlockStart.gifContractedBlock.gif
while  (iter.hasNext())  dot.gif {
InBlock.gif    Map.Entry entry 
= (Map.Entry) iter.next();
InBlock.gif    Object key 
= entry.getKey();
InBlock.gif    Object val 
= entry.getValue();
ExpandedBlockEnd.gif}

点评:
.NET环境下,引入了foreach的写法,但是IDictionary和ICollection的GetEnumerator()方法返回的类型是不一样的,这一点,很容易让人迷惑,初学者很多都会写错。如下是初学者常用的写法:
None.gif IDictionary dictionary  =   new  Hashtable();
None.gif
foreach  (Object val  in  dictionary)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//dot.gif
ExpandedBlockEnd.gif
}
这是一个地雷,.NET的基础类库和C#在语言的设计(对foreach的支持方式)的相互作用下,产生了这一个地雷,也许也可以称之为缺陷……

Java下,使用起来的方式,有点麻烦,很多初学者,不使用恰当的方法遍历Map,甚至一些写了多年Java程序员都是用比较笨的办法。
None.gif Map map  =   new  HashMap();
None.gifIterator iter 
=  map.keySet().iterator();
ExpandedBlockStart.gifContractedBlock.gif
while  (iter.hasNext())  dot.gif {
InBlock.gif    Object key 
= iter.next();
InBlock.gif    Object val 
= map.get(key);
ExpandedBlockEnd.gif}
这种方式效率会比较低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值