2012-07-30 71 views
2

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

数据结构有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()功能的这种目的。

任何人都可以阐明什么是最佳的方法是这种情况下?如果您觉得最好使用操作符重载,请您提供一些关于如何正确实现它的指导?

在此先感谢。

回答

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,使用这2种方法来比较你RouteIdentity实例。

+0

谢谢。出于好奇,397在GetHashCode()实现中有什么意义? – pdriegen 2012-07-30 14:33:24

+0

@pdriegen:这是一个改进GetHashCode()函数分布的素数(参见http://stackoverflow.com/questions/1145217/why-should-hash-functions-use-a-prime-number-模量)。 – ulrichb 2012-07-30 14:47:58

1

实施IComparable对于RouteIdentity和使用HashSet<RouteIdentity>

+0

谢谢Darek。尽管这并不是我所要求的,但我会进一步调查以查看HashSet是否比词典适合我的情况使用更好的数据结构。 – pdriegen 2012-07-30 14:35:17

+0

它可能比Dictionary更好的表现,因为你真的存储了一堆对象,而不是有一个键/值对。 – Darek 2012-07-30 15:08:51

相关问题