2

我需要根据数据结构的值键入字典。我想知道创建此密钥的最佳方法是什么?

数据结构有 3 个值:两个字符串和一个日期时间。这三个值组合起来代表我的字典的“唯一”键。

public class RouteIdentity
{
     public string RouteId {get;set;}
     public string RegionId {get;set;}
     public DateTime RouteDate {get;set;}
}

想到的一种解决方案是向RouteIdentityKey可能称为?)添加一个属性,该属性返回 3 个唯一值的某种表示。的类型Key将是字典的键值的类型。Key可能是一个简单地连接各种属性的字符串值,但这似乎非常低效。我想是否有办法实现快速散列函数以返回可能也可以工作的不同类型。

另一种可能性是覆盖 Equals 运算符RouteIdentity。我认为这可能是一种更好的方法,但我不确定如何GetHashCode()为此目的覆盖该功能。

谁能阐明这种情况下的最佳方法是什么?如果您觉得最好使用运算符重载,您能否提供一些有关如何正确实现它的指导?

提前致谢。

4

2 回答 2

3

实现 Equals() 和 GetHashCode(),..

public class RouteIdentity
{
    public string RouteId { get; set; }
    public string RegionId { get; set; }
    public DateTime RouteDate { get; set; }

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

        RouteIdentity other = (RouteIdentity) obj;

        return Equals(other.RouteId, RouteId) && 
               Equals(other.RegionId, RegionId) && 
               other.RouteDate.Equals(RouteDate);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (RouteId != null ? RouteId.GetHashCode() : 0);
            result = (result * 397) ^ (RegionId != null ? RegionId.GetHashCode() : 0);
            result = (result * 397) ^ RouteDate.GetHashCode();
            return result;
        }
    }
}

...和 ​​use new Dictionary<RouteIdentity, TValue>(),它将在内部实例化EqualityComparer<RouteIdentity>.Default,它使用这两种方法来比较您的RouteIdentity实例。

于 2012-07-30T14:12:18.240 回答
1

实施IComparableRouteIdentity使用HashSet<RouteIdentity>

于 2012-07-30T14:12:40.343 回答