筛选C# Dictionary的MyObject后,如何获取对应的Key?
如何从
Dictionary<string, MyObject>中获取筛选后值对应的键? 嘿,这个需求很清晰,咱们来捋捋怎么高效解决它。你现在的代码是先从字典的Values里筛选出Boo==false的对象,再通过自定义扩展方法拿到单个MyObject,现在要找到这个对象对应的字典键(Key)对吧?
下面给你几种实用的方案,你可以根据自己的场景选择:
方案1:直接遍历键值对(推荐,避免重复遍历)
与其先单独处理Values,不如直接操作字典的键值对(KeyValuePair<string, MyObject>),这样筛选时能同时保留Key和Value,后续找到目标对象后直接取Key就行,只需要遍历一次字典:
// 先拿到你原来逻辑中的目标对象 MyObject targetObj = fooDictionary.Values.Where(x => x.Boo == false).ToList().ExtensionMethod(); // 从字典中匹配对应的键值对 var targetKvp = fooDictionary.FirstOrDefault(kvp => kvp.Value == targetObj); // 记得处理可能的空值情况(比如ExtensionMethod返回null时) if (!string.IsNullOrEmpty(targetKvp.Key)) { string desiredKey = targetKvp.Key; // 这里就拿到你要的Key了 }
如果你的扩展方法可以稍微调整,让它支持处理IEnumerable<KeyValuePair<string, MyObject>>,那就能更高效,直接返回目标键值对:
// 假设调整后的ExtensionMethod返回KeyValuePair<string, MyObject> var targetKvp = fooDictionary.Where(kvp => kvp.Value.Boo == false).ToList().ExtensionMethodForKvp(); string desiredKey = targetKvp?.Key;
方案2:创建反向字典(适合多次查找的场景)
如果需要频繁根据MyObject查找对应的Key,而且你的字典中每个MyObject都是唯一的(不会有多个Key对应同一个Value),可以预先创建一个反向字典:
// 构建反向字典:Key是MyObject,Value是原字典的Key var reverseDictionary = fooDictionary.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); // 拿到目标对象后直接取Key MyObject targetObj = fooDictionary.Values.Where(x => x.Boo == false).ToList().ExtensionMethod(); if (reverseDictionary.TryGetValue(targetObj, out string desiredKey)) { // 成功获取Key }
⚠️ 注意:如果MyObject是引用类型,要确保它的Equals和GetHashCode方法逻辑正确;如果是值类型,默认的相等逻辑就可以用。如果存在多个Key对应同一个Value的情况,这个方法会抛出异常,因为字典的Key必须唯一。
方案3:简化的单次查找写法
如果只是偶尔查找一次,也可以用一行代码搞定(本质和方案1类似,只是写法更紧凑):
string desiredKey = fooDictionary .Where(kvp => kvp.Value.Boo == false) .FirstOrDefault(kvp => kvp.Value == fooDictionary.Values.Where(x => x.Boo == false).ToList().ExtensionMethod()) .Key;
不过这种写法会遍历两次字典(一次找目标对象,一次找对应Key),数据量大的时候效率会稍差,不推荐在性能敏感的场景使用。
额外提醒
- 如果你的
ExtensionMethod有可能返回null,一定要记得做空值判断,避免NullReferenceException; - 如果字典中存在多个
MyObject满足Boo==false且符合ExtensionMethod的筛选逻辑,FirstOrDefault只会返回第一个匹配的Key,如果你需要所有匹配的Key,可以把FirstOrDefault换成Where,然后取Select(kvp => kvp.Key)得到Key的集合。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

