2010-03-31 20 views
5

Estoy usando Contains() para identificar algo que NO figura en la lista. Así que algo como,! Contiene() del objeto List no funciona

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

pero, toda sentencia if va a cierto a pesar de MyObject ya está en la lista.

+0

Debe mostrarnos el código del método Contiene. – Timores

+1

@Timores: Contains() es un método en la lista . –

Respuesta

3

Si no tiene la capacidad de anular Iguales (o si simplemente no desea), puede implementar un IEqualityComparer<T> de su objeto y pasarlo como el segundo parámetro al método Contiene (sobrecarga). Si su objeto es un tipo de referencia, de lo contrario simplemente estaría comparando referencias en lugar de los contenidos del objeto.

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); 

En este escenario, foo2 no se añadiría a la lista. Lo haría sin el argumento del comparador.

9

¿Cuál es el tipo de MyObject? ¿Tiene un método Equals() sobrescrito correctamente?

+0

Es un objeto definido por el usuario y solo tiene 3 propiedades, 2 cadenas y 1 entero. – Tony

+0

De MSDN: "La implementación predeterminada de Equals admite la igualdad de referencia para los tipos de referencia [...]. La igualdad de referencia significa que las referencias de objeto que se comparan hacen referencia al mismo objeto". Contiene() utiliza el comparador de igualdad predeterminado, que a su vez llama Igual() (a menos que su clase implemente IEcualtable, pero eso está al lado del punto). Por lo tanto, no espere que Contains() tenga un comportamiento decente si no anuló Equals(). –

1

Si está buscando encontrar un objeto en un List<T>, entonces el parámetro en el método Contiene() debe ser el misma instancia que el de la lista. No funcionará si son dos instancias separadas pero idénticas.

+1

No es necesario que sea la misma instancia si la clase anula el método Equals y este último devuelve true – PierrOz

Cuestiones relacionadas