奇怪的字典包含关键问题

本文关键字:问题 包含关 字典 | 更新日期: 2023-09-27 17:51:08

在我开始之前,我想澄清一下,这与所有其他有点"类似"的问题不同。每一种方法我都试过了,但是我在这里得到的现象真的很奇怪。

我有一个字典,其中ContainsKey总是返回false,即使它们的GetHashCode函数返回相同的输出,并且即使它们的Equals方法返回true

这是什么意思?我哪里做错了?

我插入的两个元素都是Owner类型,没有GetHashCodeEquals方法。这些继承自类型Storable,然后实现了一个接口,并且还定义了GetHashCodeEquals

这是我的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。对象比较不同于值比较。