2012-01-09 113 views
0

我使用.NET 2.0和C#,我已經實現了IEquatible接口在我的課是這樣的: -IEquatable,如何實現這一正確

public MyClass() : IEquatable<MyClass> 
{ 
    Guid m_id = Guid.NewGuid(); 

    public Guid Id 
    { 
     get 
     { 
      return m_id; 
     } 
    } 

    #region IEquatable<MyClass> Members 

    public bool Equals(MyClass other) 
    { 
     if (this.Id == other.Id) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    #endregion 
} 

這是不好的編程習慣?我讀過,我也需要實現Object.Equals和Object.GetHashCode,但我不知道爲什麼。

我希望能夠檢查MyClass的實例未包含在MyClass類型的通用列表中。爲什麼框架只會建議你只實現Equals?

任何幫助將不勝感激。

+3

的實施可以縮短爲:'返​​回this.Id == other.Id;' 。 – Oded 2012-01-09 11:06:34

+1

[是否有完整的IEquatable實現引用?](http://stackoverflow.com/questions/1307493/is-there-a-complete-iequatable-implementation-reference)可能的重複。另外,請查看[瞭解IEquatable](http://stackoverflow.com/questions/411500/understanding-iequatable)。 – Groo 2012-01-09 11:07:17

+0

@Oded如果_other_爲null,該怎麼辦? :) – 2012-01-09 11:17:28

回答

2

您可以使用LINQ來檢查您的列表是否包含使用條件的自定義謂詞的項目。在這種情況下,你不需要重寫Equals又不履行IEquatable

// check if the list contains an item with a specific ID 
bool found = someList.Any(item => item.ID == someId); 

重寫Equals(與GetHashCode),如果你需要你的項目存儲在DictionaryHashtable實施IEquatable是非常有用的。

0

這是不好的編程習慣嗎?

實施IEquatable<T>是偉大的,更是這樣的結構,但僅僅這樣做多是不夠的。

我讀過,我還需要實現的Object.Equals

Read it here why..

和Object.GetHashCode爲好,但我不知道爲什麼。

Read it herehere。嚴重的是,這些都已經討論過很多次,這是非常簡單的。總之,你需要它與像Dictionary<,>HashSet<>

哈希涉及集合類型我希望能夠檢查一個實例的MyClass尚未包含在MyClass類型的通用列表中。爲什麼框架只會建議你只實現Equals?

取決於集合類型。對於List<T>,它只會根據您如何定義Equals方法來檢查相等性,例如對於Contains方法。對於大多數情況下,您只需要Equals。但是如果你有一個HashSet<T>那麼缺席和在場檢查將利用你的對象的散列。框架確實要求我們實施良好的散列方法(無需重新發明輪子)at appropriate places

任何幫助將不勝感激。

做如下,但你必須重載運算符==!=只有當它是有意義的你。看到你的班級,我假設你的班級具有價值語義。否則,只需忽略該部分(如果==應該表示引用相等)......從您的GUID獲取哈希碼就足夠了,前提是您只需測試相等性。

public sealed class MyClass : IEquatable<MyClass> 
{ 
    Guid m_id = Guid.NewGuid(); 

    public Guid Id { get { return m_id; } } 

    public bool Equals(MyClass other) 
    { 
     if (ReferenceEquals(this, other)) 
      return true; 

     if (ReferenceEquals(null, other)) 
      return false; 

     return Id == other.Id; 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as MyClass); 
    } 

    public static bool operator ==(MyClass lhs, MyClass rhs) 
    { 
     if (ReferenceEquals(lhs, null)) 
      return ReferenceEquals(rhs, null); 

     return lhs.Equals(rhs); 
    } 

    public static bool operator !=(MyClass lhs, MyClass rhs) 
    { 
     return !(lhs == rhs); 
    } 

    public override int GetHashCode() 
    { 
     return Id.GetHashCode(); 
    } 
} 

要不要搞錯了,利用現有的片段here的:對於一個很好的概述see this SO thread.