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

如何通过可互换多键字典实现实体间数据共享并获取SharedValue

解决自定义Key类作为字典键无法获取值的问题

嘿,我猜你现在遇到的问题是——明明往字典里加了Key和对应的SharedValue,可后来用看起来一样的Key去查,却拿不到值对吧?这事儿根源在C#里引用类型的默认相等判断逻辑上。

你定义的Key是普通类,默认情况下,两个Key对象哪怕nameA和nameB完全一致,只要是new出来的不同实例,C#就会认为它们是不同的对象,字典自然就找不到你之前存的那个值了。要解决这个问题,我们得让字典知道:判断两个Key是否相等,应该看nameA和nameB的值,而不是对象的引用地址。

方案一:重写Key类的Equals和GetHashCode方法

这是最通用的解决办法,直接修改Key类,重写这两个关键方法:

public class Key
{
    public string nameA;
    public string nameB;

    // 重写Equals,基于nameA和nameB的值判断相等
    public override bool Equals(object obj)
    {
        if (obj is not Key otherKey)
            return false;
            
        return string.Equals(nameA, otherKey.nameA, StringComparison.Ordinal) 
               && string.Equals(nameB, otherKey.nameB, StringComparison.Ordinal);
    }

    // 重写GetHashCode,基于nameA和nameB生成哈希码
    public override int GetHashCode()
    {
        // 组合两个字符串的哈希值,确保相同值的Key生成相同哈希码
        return HashCode.Combine(nameA, nameB);
    }
}

现在再去获取值就没问题了:

// 创建和存入时匹配的Key实例
var lookupKey = new Key { nameA = "User1", nameB = "User2" };
if (relation.TryGetValue(lookupKey, out var sharedValue))
{
    // 这里就能拿到id为-11的SharedValue了
    Console.WriteLine($"获取到的SharedValue ID: {sharedValue.id}");
}

方案二:用C# 9.0+的Record类型(更简洁)

如果你的项目用的是C# 9.0及以上版本,直接把Key改成record类型就完事了——record默认就实现了基于属性的值相等判断,不用自己写任何额外方法:

// Record类型自动实现值相等逻辑
public record Key(string nameA, string nameB);

使用的时候和之前一样:

// 添加数据
relation.Add(new Key("User1", "User2"), new SharedValue { id = -11 });

// 获取数据
var lookupKey = new Key("User1", "User2");
if (relation.TryGetValue(lookupKey, out var sharedValue))
{
    Console.WriteLine($"获取到的SharedValue ID: {sharedValue.id}");
}

这样是不是省心多了?

内容的提问来源于stack exchange,提问作者Vnsax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:04