奇怪的字典包含关键问题
本文关键字:问题 包含关 字典 | 更新日期: 2023-09-27 17:51:08
在我开始之前,我想澄清一下,这与所有其他有点"类似"的问题不同。每一种方法我都试过了,但是我在这里得到的现象真的很奇怪。
我有一个字典,其中ContainsKey
总是返回false
,即使它们的GetHashCode
函数返回相同的输出,并且即使它们的Equals
方法返回true
。
这是什么意思?我哪里做错了?
我插入的两个元素都是Owner
类型,没有GetHashCode
或Equals
方法。这些继承自类型Storable
,然后实现了一个接口,并且还定义了GetHashCode
和Equals
。
这是我的Storable
类。您可能想知道两个Guid
属性是否确实相等-是的,它们是相等的。我双重检查。参见后面的示例代码。
public abstract class Storable : IStorable
{
public override int GetHashCode()
{
return Id == default(Guid) ? 0 : Id.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Storable;
return other != null && (other.Id == Id || ReferenceEquals(obj, this));
}
public Guid Id { get; set; }
protected Storable()
{
Id = Guid.NewGuid();
}
}
现在,这是我的代码中出现字典的相关部分。它接受一个Supporter
对象,该对象具有指向Owner
的链接。
public class ChatSession : Storable, IChatSession
{
static ChatSession()
{
PendingSupportSessions = new Dictionary<IOwner, LinkedList<IChatSession>>();
}
private static readonly IDictionary<IOwner, LinkedList<IChatSession>> PendingSupportSessions;
public static ChatSession AssignSupporterForNextPendingSession(ISupporter supporter)
{
var owner = supporter.Owner;
if (!PendingSupportSessions.ContainsKey(owner)) //always returns false
{
var hashCode1 = owner.GetHashCode();
var hashCode2 = PendingSupportSessions.First().Key.GetHashCode();
var equals = owner.Equals(PendingSupportSessions.First().Key);
//here, equals is true, and the two hashcodes are identical,
//and there is only one element in the dictionary according to the debugger.
//however, calling two "Add" calls after eachother does indeed crash.
PendingSupportSessions.Add(owner, new LinkedList<IChatSession>());
PendingSupportSessions.Add(owner, new LinkedList<IChatSession>()); //crash
}
...
}
}
如果你需要更多的信息,请告诉我。我不确定什么样的信息是足够的,所以我很难包括更多。
纪尧姆是对的。似乎我在将其中一个键添加到字典后更改了它的值。哎!
确保传递的对象与dictionary中作为key存储的对象相同。如果您每次都创建新对象并尝试查找key,假设该对象已经存储,因为有类似的值,则containsKey返回false。对象比较不同于值比较。