2010-01-27 11 views
9

Si tengo un (referencia - qué es importante?) Tipo MyType que no anula la Igual método, lo heurística se utilizará para determinar si un ICollection <MyType> contiene una instancia determinada del tipo?ICollection <T> .Contains sobre tipos personalizados

¿Cuál es la mejor manera de usar mi propia heurística (por ejemplo, verificar la igualdad del valor de propiedad Id)?

+0

Lo específico de recogida está usando? –

+0

System.Collections.ObjectModel.Colección Ben

Respuesta

7

Como su tipo no anula Equals, se usará la implementación predeterminada de Equals, es decir, igualdad de referencia. Así que Contendrá será verdadero si la colección contiene esa misma instancia.

Para usar su propia comparación, implemente IEqualityComparer<T> (por ejemplo, para comparar los Id.) Y pase una instancia de su comparador al método Contiene. (Esto supone que puede usar extensiones LINQ, ya que el método "nativo" ICollection<T>.Contains no tiene la sobrecarga de IEqualityComparer).

+0

fuera de interés son los tipos de valor tratados por igual, y ¿por qué no simplemente anula el método equals? – Ben

+0

Los tipos de valores se consideran iguales si todos sus campos son iguales. Por supuesto, puede anular Equals en un tipo de valor igual que en un tipo de referencia, y puede escribir un IEqualityComparer personalizado para un tipo de valor igual que para un tipo de referencia. – itowlson

1

No está definido por ICollection<T> - las diferentes implementaciones pueden usar diferentes métodos. De MSDN:

Las implementaciones pueden variar en la forma en que determinar la igualdad de los objetos; para ejemplo, List<T> utiliza Comparer<T>.Default, mientras que Dictionary<TKey, TValue> permite al usuario especificar la IComparer<T> aplicación a utilizar para comparar teclas

En la mayoría de los casos, sólo comparar las referencias, pero usted debe comprobar la documentación para el específico ICollection<T> que está usando.

0

yo sepa, la referencia (dirección en la memoria) se comparará ...

Si la referencia no es lo suficientemente bueno para usted entonces es posible comparar la identificación, como usted ha mencionado.

0

De acuerdo con MSDN:

Las implementaciones pueden variar en la forma en que determinar la igualdad de los objetos; para ejemplo, Lista < (De < (T>)>) utiliza Comparer < (De < (T>)>) .. ::. Por defecto, mientras que Diccionario < (De < (TKey, TValue>)>) permite al usuario especificar la aplicación IComparer < (Of < (T>)>) que se utilizará para comparar las claves .

La mejor manera de hacerlo por su cuenta es el uso de la sobrecarga que toma un IEqualityComparer<T>

public class MyComparer : IEqualityComparer<MyType> 
{ 
    public bool Equals(MyType x, MyType y) 
    { 
     return x.Id == y.Id; 
    } 

    public int GetHashCode(MyType obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 
} 
Cuestiones relacionadas