我需要根据数据结构的值键入字典。我想知道创建这个密钥的最佳方法是什么?
数据结构有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()
函数。
任何人都可以了解这种情况的最佳方法是什么?如果您觉得最好使用运营商重载,请提供一些关于如何正确实施的指导?
提前致谢。
答案 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>
。