2010-03-20 30 views
5

我在這裏問了一個問題:When To Use IEquatable And Why關於使用IEquatable。有誰知道如果在使用泛型集合時沒有實現iequtalable會發生什麼?

從MSDN:

的IEquatable(T)接口用於通過通用對象集合,例如詞典(TKEY的,TValue),列表(T),和LinkedList(T),用於在這樣的方法平等測試時作爲Contains,IndexOf,LastIndexOf和Remove。

如果你不實現那個接口究竟發生了什麼?異常/默認對象等於/ ref等於?

回答

2

這裏有一個例子:

public class Foo : IEquatable<Foo> 
{ 
    public string Bar { get; set; } 

    public bool Equals(Foo other) 
    { 
     return string.Equals(other.Bar, Bar); 
    } 
} 

class Program 
{ 

    public static void Main(string[] args) 
    { 
     var foos = new List<Foo>(new[] 
     { 
      new Foo { Bar = "b1" }, 
      new Foo { Bar = "b2" }, 
      new Foo { Bar = "b3" }, 
     }); 

     var foo = new Foo { Bar = "b2" }; 
     Console.WriteLine(foos.IndexOf(foo)); // prints 1 
    } 
} 

現在發表意見IEquatable<Foo>執行,並再次運行該程序。

+1

Interresting接受的答案實際上並不包含答案...;) – Guffa 2010-03-20 10:22:19

+0

@Guffa,有時候一個例子勝過千言萬語。請不要誤解我的意思,我認爲你的回答非常好,它清楚地解釋了IEquatable '如何工作的理論。只是當你舉出一個人們可以玩的例子時,他們可以看到它在實踐中是如何運作的。 – 2010-03-20 10:31:42

+0

有沒有特別的一點可以省略例子的結果? – Guffa 2010-03-20 14:57:39

4

如果您未實現相等比較,將使用默認實現。

如果密鑰是引用類型,則使用引用比較。除非您保留關鍵對象,以便在從集合中檢索項目時可以使用它們,否則它們將丟失。使用相同的數據創建新的關鍵對象會爲您提供具有差異參考的對象,因此它會錯過您正在查找的項目。

1

Dictionary<TKey,TValue>使用IEquatable<T>來比較TKey值有點不正確。它實際上使用IEquatilyComparer<T>來比較值。

當沒有明確提供時,雖然它將使用EqualityComparer<TKey>.Default來生成比較器。此靜態屬性有一個啓發式來確定哪個是比較TKey值的最佳方法。如果TKey類型實現了IEqutable<TKey>,則將使用此類型。如果不是,它會直接回退到使用.Equals方法。

所以,如果你不執行IEquatable<T>並沒有提供明確地IEqualityComparer<T>然後Dictionary<TKey,TValue>將依靠正常.Equals。

相關問題