千家信息网

Dictionary遍历的使用方法有哪些

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容主要讲解"Dictionary遍历的使用方法有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Dictionary遍历的使用方法有哪些"吧!使用
千家信息网最后更新 2025年11月08日Dictionary遍历的使用方法有哪些

本篇内容主要讲解"Dictionary遍历的使用方法有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Dictionary遍历的使用方法有哪些"吧!

使用 foreach 遍历

为了方便演示,先上一段测试代码:

var dict = new Dictionary()             {                [10] = "A10",                 [20] = "A20",                 [30] = "A30",                 [40] = "A40",                 [50] = "A50"             };

1. 直接 foreach dict

如果要拿百分比说话,估计有 50%+ 的小伙伴用这种方式,为啥,简单粗暴呗,其他没什么好说的,直接上代码:

foreach (var item in dict)            {                Console.WriteLine($"key={item.Key},value={item.Value}");            }

这里的 item 是底层在 MoveNext 的过程中用 KeyValuePair 包装出来的,如果你不信的话,看下源码呗:

public bool MoveNext()    {        while ((uint)_index < (uint)_dictionary._count)        {            ref Entry reference = ref _dictionary._entries[_index++];            if (reference.next >= -1)            {                _current = new KeyValuePair(reference.key, reference.value);                return true;            }        }    }

2. foreach 中 使用 KeyPairValue 解构

刚才你也看到了 item 是 KeyValuePair 类型,不过的是 netcore 对 KeyValuePair 进行了增强,增加了 Deconstruct 函数用来解构 KeyValuePair,代码如下:

public readonly struct KeyValuePair     {        private readonly TKey key;         private readonly TValue value;         public TKey Key => key;         public TValue Value => value;         public KeyValuePair(TKey key, TValue value)         {            this.key = key;             this.value = value;         }        public void Deconstruct(out TKey key, out TValue value)         {            key = Key;            value = Value;         }    }

有了这个解构函数,你就可以在遍历的过程中直接拿到 key,value,而不是包装的 KeyValuePair,这在 netframework 中可是不行的哈,实现代码如下:

foreach ((int key, string value) in dict)             {                Console.WriteLine($"key={key},value={value}");             }

3. foreach keys

前面的例子都是直接对 dict 进行 foreach,其实你还可以对 dict.keys 进行 foreach 遍历,然后通过遍历出的 key 对 dict 进行类索引器读取,代码如下:

foreach (var key in dict.Keys)           {                Console.WriteLine($"key={key},value={dict[key]}");           }

说到这里,不知道你是否有一个潜意识,那就是 dict 只能通过 foreach 进行遍历,真相是不是这样的呢? 要寻找答案,还是回头看一下 foreach 是如何进行遍历的。

public struct Enumerator : IEnumerator>, IDisposable, IEnumerator, IDictionaryEnumerator {    public bool MoveNext()     {        while ((uint)_index < (uint)_dictionary._count)         {            ref Entry reference = ref _dictionary._entries[_index++];             if (reference.next >= -1)             {                _current = new KeyValuePair(reference.key, reference.value);                 return true;             }        }        _index = _dictionary._count + 1;         _current = default(KeyValuePair);         return false;     }}

仔细看这个 while 循环,你就应该明白,本质上它也是对 entries 数组进行遍历,那底层都用了 while,我是不是可以用 for 来替换然后循环 dict 呢?哈哈,反正就是模仿呗。

使用 for 遍历

为了把 MoveNext 中的代码模拟出来,重点在于这条语句: ref Entry reference = ref _dictionary._entries[_index++];, 其实很简单,_entries 数组内容的提取可以用 Linq 的 ElementAt 方法,是不是~ ,改造后的代码如下:

for (int i = 0; i < dict.Count; i++) {                (int key, string value) = dict.ElementAt(i);     Console.WriteLine($"key={key},value={dict[key]}"); }

接下来是不是很好奇这个 ElementAt 扩展方法是如何实现的,一起看看源码吧。

public static TSource ElementAt(this IEnumerable source, int index) {        IList list = source as IList;     if (list != null)     {            return list[index];     }        if (index >= 0)     {            using (IEnumerator enumerator = source.GetEnumerator())         {                while (enumerator.MoveNext())             {                    if (index == 0)                 {                        return enumerator.Current;                 }                    index--;                }            }        }    }

到此,相信大家对"Dictionary遍历的使用方法有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

代码 方法 使用方法 内容 函数 就是 底层 数组 源码 过程 包装 学习 循环 不行 好说 实用 更深 好奇 粗暴 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全领导小组未成立 深圳蓝蛙网络技术有限公司 网络安全法主题团日 全国大学生网络技术竞赛官网 天津好的软件开发品质保障 服务器显示超时怎么办 网络安全教育与党员的关系 计算机网络技术未来就业 web报表与数据库连接 数据库显示借阅者读者号答案 抑郁CCBT软件开发 彩票怎么搭建安全服务器 南京金达速宏网络技术有限公司 互联网行业数据库漏洞系统 仙居网络安全 大华摄像机时钟服务器 浙江网络安全技能竞赛 网络安全重点单位是什么 宝山区网络技术服务案例 帮我搜索网络安全手抄报 岳阳读软件开发的大学 100万数据库优化 舞曲视频软件开发 商业数据库专业硕士解读 山西晋缘网络技术有限公司李轶 国家网络安全法刑事责任 人民共和国网络安全法解读下 南昌服务器机箱机柜 jsp表格从数据库读取数据 怎么拒绝新纪元取数据库数据
0