2012-07-30 59 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

相關問題