使用自定义类作为键时出现“字典中不存在给定的键”错误

2024-01-03

我有这样的代码:

if (CounterForEachRelatedTagDict.Select(x => x.Key).Contains(tag.Key))
   CounterForEachRelatedTagDict[tag.Key] += tag.Value;

IF语句是否有可能同时返回trueCounterForEachRelatedTagDict[tag.Key]返回“给定的键不存在于字典中”错误?tag is a KeyValuePair<MyClass,int>.

CounterForEachRelatedTagDict是这样发起的:

Dictionary<MyClass, int> CounterForEachRelatedTagDict = new Dictionary<MyType, int>();

MyClass是这样的

public class MyClass
{
    public string name {get;set;}
    public Guid Id { get; set; }
    ...
}

对我来说这几乎是不合理的......


问题是你的Equal and GetHashCode方法不同步MyType.

当你使用CounterForEachRelatedTagDict.Select(x => x.Key).Contains(tag.Key)您正在使用所有键执行线性搜索Equals将您要搜索的内容与每个键进行比较。

当你使用ContainsKey in Dictionary、索引器或用于查找密钥的多种其他方法之一,您首先使用该密钥对密钥进行哈希处理GetHashCode然后它只使用Equals找出该存储桶中哪些(希望是极少数对象)是相同的。

发生的事情是你有两个对象first.Equals(second)返回 true,但是对于哪个GetHashCode返回两个不同的值。非常重要的是,当使用对象作为键时Dictionary,任意两个对象Equals回报true还必须返回相同的整数GetHashCode。理想情况下,不同的对象应尽可能返回不同的哈希码,但这并不总是可能的(具有相同哈希码的不同对象称为“冲突”)。

请注意,这种查找键的方法虽然确实强制您确保用作键的所有对象都有合理的实现GetHashCode(默认实现来自object很少合适)这个算法*非凡*高效(具有高效的散列算法),这就是它值得的原因。使用ContainsKey,或者字典的索引器,比遍历每个键并比较它要快得多,这就是你的Select代码需要做以避免使用GetHashCode.

所以,回答你的问题,是的,这是很有可能的CounterForEachRelatedTagDict.Select(x => x.Key).Contains(tag.Key)找到索引器找不到的项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义类作为键时出现“字典中不存在给定的键”错误 的相关文章

随机推荐