C# !列表对象的Contains()不';行不通

C# !列表对象的Contains()不';行不通,c#,C#,我正在使用Contains()识别列表中不包含的内容。比如说 if(!list.Contains(MyObject)) { //do something } 但是,即使列表中已经有MyObject,整个if语句仍然为真。MyObject的类型是什么?它是否具有正确重写的Equals()方法?如果您正在测试在列表中查找对象,则Contains()方法中的参数必须与列表中的参数相同。如果它们是两个独立但相同的实例,则该方法将不起作用。如果您不能重写Equals(或者如果您只是不想重写),则可以实现

我正在使用
Contains()
识别列表中不包含的内容。比如说

if(!list.Contains(MyObject))
{
//do something
}

但是,即使列表中已经有
MyObject
,整个if语句仍然为真。

MyObject的类型是什么?它是否具有正确重写的Equals()方法?

如果您正在测试在
列表中查找对象,则Contains()方法中的参数必须与列表中的参数相同。如果它们是两个独立但相同的实例,则该方法将不起作用。

如果您不能重写Equals(或者如果您只是不想重写),则可以实现对象的
IEqualityComparer
,并将其作为第二个参数传递给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
}
class-Foo
{
公共字符串Blah{get;set;}
}
类FooComparer:IEqualityComparer
{
#地区资格比较成员
公共布尔等于(Foo x,Foo y)
{
返回x.Blah等于(y.Blah);
}
公共int GetHashCode(Foo obj)
{
返回obj.Blah.GetHashCode();
}
#端区
}

Foo-Foo=new-Foo(){Blah=“Apple”};
Foo foo2=new Foo(){Blah=“Apple”};
List foos=新列表();
添加(foo);
如果(!foos.Contains(foo2,new foopcomparer()))
foos.Add(foo2);

在这种情况下,foo2不会被添加到列表中。如果没有comparer参数,则会出现这种情况。

您需要向我们展示Contains方法的代码。@Timores:Contains()是列表中的一个方法。它是用户定义的对象,只有3个属性、2个字符串和1个整数。来自MSDN:“Equals的默认实现支持引用类型的引用相等[…].Reference equality表示被比较的对象引用引用同一个对象。“Contains()使用默认的相等比较器,该比较器反过来调用Equals()(除非您的类实现了IEquatable,但这并不重要)。因此,如果没有重写Equals(),则不要期望Contains()具有良好的行为。如果类重写方法Equals并且后者返回true,则不需要是同一个实例
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);