2009-04-08 89 views
7

是否有可能,如果是這樣,我該如何重寫的Contains方法,其中T是我自己的自定義類型?覆蓋.NET通用列表<MyType> .Contains(MyTypeInstance)?

+0

從你的問題來看,你需要達到什麼目標有點不清楚。你a)是否需要標準Contains與你的自定義類型一起工作,或者b)在調用Contains時做一些特殊的邏輯? – 2009-04-08 08:57:51

+0

彼得,基本上是列表我在運行時不是在內存中,它是鬆散/弱引用到OODBMS。如果我在List上做一個native .net .Contains,它會從oodbms後端檢索整個列表並在本地進行評估。因此,我想用適當的(後端)查詢語法覆蓋它。 – 2009-04-09 13:11:15

+0

@Jörg - 記住這一點,重寫Equals/GetHashCode如何解決您的問題(@Cans答案)? – 2009-04-11 10:23:10

回答

5

爲了使自己的包含執行,你可以創建一個實現IList接口的類。這樣你的班級就會像IList一樣。你可以在內部有一個真正的List來做標準的東西。

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

您需要覆蓋班級中的EqualsGetHashCodeMyType)。

0

如果你實現你的平等自定義類型,包含列表的功能將工作

7

List<T>使用EqualityComparer<T>.Default做比較;首先檢查你的對象是否實現IEquatable<T>;否則使用object.Equals

所以;最簡單的方法是覆蓋Equals(總是更新GetHashCode以匹配Equals中的邏輯)。另外,使用LINQ來代替:

bool hasValue = list.Any(x => x.Foo == someValue); 
1

取決於你有什麼具體的需求進行覆蓋,你可以使用LINQ表達式做這件事:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need 

然後,您可以把它包裝在方便的擴展方法。