C#中查找Dictionary重复值的方法

星野
星野
发布时间:2026-10-13 | 1人浏览过
原创

在 C# 开发中,`Dictionary<K, V>` 常被用于存储唯一键与对应值的映射。虽然键必须是唯一的,但多个不同的键可能指向相同的值。本文将展示如何使用一行 LINQ 代码高效地找出这些重复的值。

背景与目标

在处理数据时,我们经常遇到需要检查“哪些值被多个键关联”的场景。例如,在配置管理或日志分析中,识别重复的配置项或错误的映射关系非常重要。传统的遍历方式代码冗长,而使用 LINQ(Language Integrated Query)可以极大地简化这一过程。

准备条件

  • C# 开发环境(如 Visual Studio 或 VS Code)
  • 引用 System.Linq 命名空间
  • 一个包含键值对的 Dictionary<int, string> 实例

操作顺序

第1步:初始化测试数据

首先,创建一个包含一些重复值的字典以便演示。下面示例中,“Apple of Sodom”和“Water Birch”出现了两次:

// 初始化一个包含键和值的字典
Dictionary<int, string> plants = new Dictionary<int, string>() {
  {1,"Speckled Alder"},
  {2,"Apple of Sodom"},
  {3,"Hairy Bittercress"},
  {4,"Pennsylvania Blackberry"},
  {5,"Apple of Sodom"},  // 重复值
  {6,"Water Birch"},     // 重复值
  {7,"Meadow Cabbage"},
  {8,"Water Birch"}      // 重复值
};

第2步:使用 LINQ GroupBy 查找重复项

核心逻辑在于将字典按值(Value)进行分组,然后筛选出组内元素数量大于1的分组。每组中的 Key 即为重复的值本身,而 Grouop 对象则包含了所有拥有该值的键值对。

// 查找重复值
var duplicateValues = plants.GroupBy(x => x.Value)
                            .Where(x => x.Count() > 1);
                            
// 注意:上面的代码获取的是重复的「值」以及拥有这些值的所有条目。
// 如果只想要重复的「值」列表,可以使用 Select:

更精确地获取仅重复值的列表:

// 获取所有重复出现的值的集合
var duplicateKeys = plants.GroupBy(x => x.Value)
                          .Where(g => g.Count() > 1)
                          .Select(g => g.Key)

第3步:输出结果验证

遍历查询结果,查看具体的重复值和对应的原始键:

// 遍历并打印结果
foreach(var group in duplicateValues) 
{
    Console.WriteLine($"重复的值: {group.Key}");
    foreach(var item in group) 
    {
        Console.WriteLine($"  键: {item.Key}, 值: {item.Value}");
    }
}

运行上述代码,控制台将输出: - 重复的值: Apple of Sodom (来自键 2 和 5) - 重复的值: Water Birch (来自键 6 和 8)

完成判断

当 duplicateValues 或 duplicateKeys 中包含非空数据时,即成功识别出了字典中的重复值。你可以将此逻辑封装为扩展方法或在业务逻辑中调用。

简要总结

利用 GroupBy 和 Where 组合是 C# 中处理 Dictionary 重复值最简洁、高效的方式。它避免了手动创建辅助集合(如 HashSet)来判断重复的复杂性,同时保持了代码的可读性。

以上就是C#中查找Dictionary中重复值的详细内容,更多关于C# Dictionary 操作技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表