2010-11-16 66 views
1

我有兩個通用列表,其中包含相同的對象類型T。例如 oGenList1.Items(0)oGenList2.Items(3)相同(它們的屬性具有相同的值等)。
我在做這樣的事情:Generic.List - 包含函數如何工作?

oGenList2.Contains(oGenList1.Items(0)) 

它總是顯示false;我不明白爲什麼。你有什麼主意嗎? 是否必須定義類T的任何比較器才能強制此函數正常工作?

我已經添加了等於功能,它仍然無法正常工作。 :( 我在非常簡單的項目由我的情況一個簡單的模擬,它的工作原理。 但我的情況比較複雜。我從班其他的等 繼承任何想法,爲什麼它可能無法正常工作?

回答

5

你不需要定義一個自定義比較器;如果你的場景很簡單(你只想讓Contains表現正常),只需重寫你的類型的Equals方法來比較兩個對象是否相等根據你想要的標準,你應該是好的(哦,如果你壓倒Equals,你也應該覆蓋GetHashCode

基本例如:

class X : IEquatable<X> 
{ 
    public int Value { get; set; } 

    public bool Equals(X other) 
    { 
     return other != null && other.Value == Value; 
    } 

    // This is the main part you need to do. Otherwise by default 
    // object.Equals just tests for reference equality. 
    public override bool Equals(object obj) 
    { 
     return Equals(obj as X); 
    } 

    public override int GetHashCode() 
    { 
     return Value; 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     var list1 = new List<X> { new X { Value = 1 } }; 
     var list2 = new List<X> { new X { Value = 1 } }; 

     // Since type X overrides the Equals method to test 
     // the equality of two instances' properties, this line 
     // outputs True. 
     Console.WriteLine(list2.Contains(list1[0])); 
    } 
} 
2

IIRC,這將使用EqualityComparer<T>.Default做比較。首先測試您的類型T是否實現IEquatable<T> - 如果是的話,它將使用該接口和Equals(T)方法。否則它只會使用object.Equals(object)(注意它也考慮到null s和Nullable<T>,所以你不必)。

默認情況下,這意味着只有在它們是相同實例(結構在字段級別進行比較)時纔會被視爲相等。如果你覆蓋Equals你應該得到你期望的行爲,但是請注意,如果你覆蓋Equals你也應該覆蓋GetHashCode有一個類似的實現。