x.Key).Contains(tag.Key)) CounterForEachRel-6ren">
gpt4 book ai didi

c# - 使用自定义类作为key时"the given key was not present in the dictionary"错误

转载 作者:太空狗 更新时间:2023-10-29 23:00:47 25 4
gpt4 key购买 nike

我有这样的代码:

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

有没有可能IF语句返回true,同时CounterForEachRelatedTagDict[tag.Key]返回“字典中不存在给定的键”错误? tagKeyValuePair<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; }
...
}

在我看来这几乎是不合理的......

最佳答案

问题是您的 EqualGetHashCode 方法对于 MyType 不同步。

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

当您在 Dictionary 中使用 ContainsKey、索引器或许多其他方法之一来查找键时,您首先使用 GetHashCode< 对键进行哈希处理 然后它仅使用 Equals 来查找该桶中哪些(希望很少的对象)相同。

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

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

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

关于c# - 使用自定义类作为key时"the given key was not present in the dictionary"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com