You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:12:49