C#:优化字典访问(键结构中的哈希)

Sto*_*ver 1 c# hash dictionary

因此,我需要在C#中创建一个结构,该结构将充当(很大)字典的键,如下所示:

private readonly IDictionary<KeyStruct, string> m_Invitations;
Run Code Online (Sandbox Code Playgroud)

问题是,我真的需要一个结构用作键,因为只能通过两个单独的数据项来标识条目,其中一个可以是空(不仅是空!)字符串。

我需要在该结构上实现什么?您将如何创建哈希?哈希冲突(偶尔发生)会严重影响性能还是可以忽略不计?

我问,因为这是“内循环”代码。

Jef*_*Cyr 5

如果您有共享工具,则可以使用Alt-Ins-> Equality成员生成这些方法。

这是您为KeyStruct生成的代码:

public struct KeyStruct : IEquatable<KeyStruct>
{
    public string Value1 { get; private set; }
    public long Value2 { get; private set; }

    public KeyStruct(string value1, long value2)
        : this()
    {
        Value1 = value1;
        Value2 = value2;
    }

    public bool Equals(KeyStruct other)
    {
        return Equals(other.Value1, Value1) && other.Value2 == Value2;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (obj.GetType() != typeof (KeyStruct)) return false;
        return Equals((KeyStruct) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((Value1 != null ? Value1.GetHashCode() : 0)*397) ^ Value2.GetHashCode();
        }
    }

    public static bool operator ==(KeyStruct left, KeyStruct right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(KeyStruct left, KeyStruct right)
    {
        return !left.Equals(right);
    }
}
Run Code Online (Sandbox Code Playgroud)