2009-04-08 595 views
7

¿Es posible, y si es así cómo puedo reemplazar el método de otra manera normal List<T>Contains, donde T es mi propia, de tipo personalizado?Anular .NET Lista genérica <MyType> .Contains (MyTypeInstance)?

+0

que es un poco claro de su pregunta lo que hay que lograr. ¿A) necesita el estándar Contiene para trabajar con su tipo personalizado ob) hace alguna lógica especial cuando se llama a Contiene? –

+0

Pedro, básicamente la Lista estoy teniendo no está en memoria en tiempo de ejecución, es vagamente/débil hace referencia a un SGBDOO. Si hago un .net nativo. Contiene en la lista, recupera toda la lista del backend de oodbms y evalúa localmente. Por lo tanto quería anularla con (back-end) sintaxis de consulta adecuada .. –

+0

@ Jörg - así que con eso en mente, ¿cómo primordial es igual a/GetHashCode a resolver su problema (@Cans respuesta)? –

Respuesta

5

Para hacer su propio Contiene aplicación puede crear una clase que implementa la interfaz IList. De esa forma tu clase se verá como IList. Podría tener una Lista real internamente para hacer las cosas estándar.

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

Debe sobrescribir Equals y GetHashCode en su clase (MyType).

0

Si implementa iguales a los que tipo personalizado, el contiene función de la Lista trabajará

+0

No, la lista nunca usará el operador ==; only Equals –

+0

No creo que merezca un voto negativo, sin embargo. The Equals es verdadero; arreglado eso (+1) –

7

List<T> utiliza EqualityComparer<T>.Default hacer comparaciones; esto verifica primero si su objeto implementa IEquatable<T>; de lo contrario, se usa object.Equals.

Así; la cosa más fácil de hacer es reemplazar Equals (siempre actualizar GetHashCode para que coincida con la lógica de Equals). Como alternativa, utilizar LINQ lugar:

bool hasValue = list.Any(x => x.Foo == someValue); 
+0

@Marc Gravell: entonces si quiero probar la 'igualdad' de 2 clases personalizadas que solo contienen propiedades y campos, ¿necesito implementar IEquatable en mi clase? Debo haber estado muy cansado cuando asumí que 2 clases se considerarían "iguales" solo porque los campos contenían los mismos valores en cada clase. :/... gracias por la sugerencia;) – IAbstract

+0

@Marc Gravell: bueno, técnicamente, no importaría lo que contengan. Lo que es importante es que 'correctamente' implemente IEquatable y seleccione el campo que debería dictar si otro MyClass se considera igual. – IAbstract

+0

@dboarman - exactamente. Y en cuanto a su primer punto, IIRC estructura * do * se comporta así, por lo que no estaba a un millón de millas de distancia. –

1

Dependiendo de cuáles son las necesidades específicas que tiene en su anulación podría utilizar la expresión LINQ para hacer eso:

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

A continuación, puede envolverlo en un método de extensión por conveniencia .

Cuestiones relacionadas