C# 实现Dictionary与List取交集并返回匹配的完整字典项
解决方案
核心思路
不要只取Dictionary的Values做交集,直接遍历字典的完整KeyValuePair项,过滤出Value存在于目标List中的项,再按需转为字典即可。
代码实现
基础版本(适合List数据量小的场景)
static void Test() { var dict = new Dictionary<string, string>(); dict.Add("license1", "123"); dict.Add("license2", "456"); dict.Add("license3", "789"); var list = new List<string>(); list.Add("444"); list.Add("111"); list.Add("123"); // 过滤匹配项并转为新字典 var result = dict.Where(kv => list.Contains(kv.Value)) .ToDictionary(kv => kv.Key, kv => kv.Value); }
运行后result就是你期望的{"license1": "123"}结果。
性能优化版本(适合List数据量大的场景)
如果List元素较多,先将List转为HashSet可以将查找复杂度从O(n)降到O(1),大幅提升过滤效率:
static void Test() { var dict = new Dictionary<string, string>(); dict.Add("license1", "123"); dict.Add("license2", "456"); dict.Add("license3", "789"); var list = new List<string>(); list.Add("444"); list.Add("111"); list.Add("123"); // 先转HashSet优化查找性能 var matchValueSet = new HashSet<string>(list); var result = dict.Where(kv => matchValueSet.Contains(kv.Value)) .ToDictionary(kv => kv.Key, kv => kv.Value); }
补充说明
- 如果不需要最终结果为字典格式,去掉最后的
ToDictionary调用,直接保留Where返回的IEnumerable<KeyValuePair<string, string>>集合即可。 - 若字典存在多个Key对应同一个匹配Value的情况,所有符合条件的键值对都会被返回。
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

