如何通过可互换多键字典实现实体间数据共享并获取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
相关产品推荐
相关产品推荐

