我正在使用Contains()
来识别列表中不包含的内容。等等,
if(!list.Contains(MyObject))
{
//do something
}
但是,即使MyObject
已经在列表中,整个if语句也会变为true。
答案 0 :(得分:9)
MyObject的类型是什么?它是否有正确覆盖的Equals()方法?
答案 1 :(得分:3)
如果您无法覆盖Equals(或者如果您不想),则可以实现对象的IEqualityComparer<T>
并将其作为第二个参数传递给Contains方法(超载)。如果您的对象是引用类型,则它只是比较引用而不是对象的内容。
class Foo
{
public string Blah { get; set; }
}
class FooComparer : IEqualityComparer<Foo>
{
#region IEqualityComparer<Foo> Members
public bool Equals(Foo x, Foo y)
{
return x.Blah.Equals(y.Blah);
}
public int GetHashCode(Foo obj)
{
return obj.Blah.GetHashCode();
}
#endregion
}
...
Foo foo = new Foo() { Blah = "Apple" };
Foo foo2 = new Foo() { Blah = "Apple" };
List<Foo> foos = new List<Foo>();
foos.Add(foo);
if (!foos.Contains(foo2, new FooComparer()))
foos.Add(foo2);
在这种情况下,foo2不会添加到列表中。它没有比较器论证。
答案 2 :(得分:1)
如果您要测试在List<T>
中查找对象,则Contains()方法中的参数必须是与列表中的相同的实例。如果它们是两个独立但相同的实例,它将无法工作。