是否有可能,如果可以,如何覆盖普通Contains
的{{1}}方法,其中List<T>
是我自己的自定义类型?
答案 0 :(得分:7)
List<T>
使用EqualityComparer<T>.Default
进行比较;首先检查您的对象是否实现了IEquatable<T>
;否则使用object.Equals
。
因此;最简单的方法是覆盖Equals
(始终更新GetHashCode
以匹配Equals
中的逻辑)。或者,使用LINQ代替:
bool hasValue = list.Any(x => x.Foo == someValue);
答案 1 :(得分:5)
要创建自己的Contains实现,您可以创建一个实现IList接口的类。这样你的课就会像IList一样。你可以在内部有一个真正的List来做标准的事情。
class MyTypeList : IList<MyType>
{
private List<MyType> internalList = new ...;
public bool Contains(MyType instance)
{
}
....
}
答案 2 :(得分:2)
您需要覆盖班级中的Equals
和GetHashCode
(MyType
)。
答案 3 :(得分:1)
根据您在覆盖中的具体需求,您可以使用Linq表达式来执行此操作:
list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need
为方便起见,您可以将其包装在扩展方法中。
答案 4 :(得分:0)
如果实现自定义类型的等于,则List的contains函数将起作用