确保数据结构中值唯一性的最佳方法?

时间:2012-07-30 14:03:02

标签: c# dictionary

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

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

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

我想到的一个解决方案是向RouteIdentity(也许称为Key)添加一个属性,该属性返回3个唯一值的一些表示。 Key的类型将是字典的键值的类型。 Key可以是一个简单地连接各种属性的字符串值,但这看起来非常低效。我想如果有办法实现快速哈希函数来返回可能也有效的其他类型。

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

任何人都可以了解这种情况的最佳方法是什么?如果您觉得最好使用运营商重载,请提供一些关于如何正确实施的指导?

提前致谢。

2 个答案:

答案 0 :(得分: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;
        }
    }
}

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

答案 1 :(得分:1)

IComparable实施RouteIdentity并使用HashSet<RouteIdentity>