C#中List与Dictionary遍历差异及索引访问疑问
List能用for循环遍历的原因
List的底层是动态数组,元素在内存中连续存储。每个元素对应一个从0开始的整数下标,通过这个下标可以直接定位到元素的内存位置。同时List实现了IList<T>接口,提供了Count属性获取元素总数,因此你可以写出for (int i = 0; i < list.Count; i++)这样的循环,通过list[i]逐个访问元素——本质是利用连续内存的下标偏移特性快速定位元素。
Dictionary不能用for循环但支持索引访问的原因
首先要明确:Dictionary的a[0]不是按“位置下标”访问元素,而是按**键(Key)**来取值。比如你先执行dict.Add(0, 100),dict[0]才能拿到100;如果没存过键为0的元素,这么写会直接抛出KeyNotFoundException异常。
至于无法用for循环遍历的原因:Dictionary底层是哈希表结构,元素并非连续存储,也没有从0开始的整数下标与元素一一对应。它是根据键的哈希值将元素散列到不同的“桶”中,元素的存储顺序和插入顺序无关,也无法通过连续的整数索引定位某个元素。Dictionary没有实现支持整数下标访问的接口(比如IList<T>),因此你没法用for (int i = 0; i < dict.Count; i++)的方式遍历——因为你无法通过i获取对应位置的元素。
而foreach可以遍历Dictionary,是因为它实现了IEnumerable<T>接口,能够枚举所有的KeyValuePair<TKey, TValue>对象,不受内部存储顺序的影响。
内容的提问来源于stack exchange,提问作者OIF
相关产品推荐
相关产品推荐

