覆盖.NET通用列表<mytype> .Contains(MyTypeInstance)?</mytype>

时间:2009-04-08 08:30:07

标签: c# .net list

是否有可能,如果可以,如何覆盖普通Contains的{​​{1}}方法,其中List<T>是我自己的自定义类型?

5 个答案:

答案 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)

您需要覆盖班级中的EqualsGetHashCodeMyType)。

答案 3 :(得分:1)

根据您在覆盖中的具体需求,您可以使用Linq表达式来执行此操作:

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

为方便起见,您可以将其包装在扩展方法中。

答案 4 :(得分:0)

如果实现自定义类型的等于,则List的contains函数将起作用