如何获取Dictionary数组中的所有键?无需遍历整个数组(可使用Linq)
解决字典数组获取所有键的问题
嘿,这个问题我太懂了!你踩的坑其实很典型:matrix是数组类型,不是单个Dictionary,所以直接调用matrix.Keys肯定会报错——数组本身根本没有Keys这个成员呀!
不过用Linq确实能写出非常简洁的代码,不用自己写嵌套的foreach循环。这里分两种常见场景给你方案:
1. 获取所有键(允许重复,处理可能的null字典)
因为你初始化的是new Dictionary<int, string>[10],数组里的每个元素默认都是null,所以第一步得先过滤掉这些空字典,避免空引用异常:
using System.Linq; // 得到所有字典的键,包含重复项 var allKeys = matrix .Where(dict => dict != null) // 跳过空字典 .SelectMany(dict => dict.Keys); // 把所有字典的键平铺成一个序列
2. 获取去重后的唯一键
如果多个字典可能有相同的键,你需要得到不重复的键集合,只需要在后面加上Distinct():
var uniqueKeys = matrix .Where(dict => dict != null) .SelectMany(dict => dict.Keys) .Distinct();
额外说明
- 核心是
SelectMany方法:它和Select的区别是,Select会把每个字典的键集合变成一个“集合的集合”,而SelectMany会把所有集合里的元素合并成一个单一的序列,这正是你需要的效果。 - 如果能确保数组里的每个字典都已经被初始化(没有null),可以直接去掉
Where(dict => dict != null)这一步,代码会更短。 - 虽然Linq没有显式写foreach,但底层其实还是在遍历数组和每个字典的键——不过这已经是最简洁、最符合C#惯用写法的实现了,比手动写循环清爽多了。
内容的提问来源于stack exchange,提问作者Harshil Doshi
相关产品推荐
相关产品推荐

