Lo que se debe hacer para utilizar el valor de un tipo de referencia como una clave de diccionario?

StackOverflow https://stackoverflow.com/questions/2881742

Pregunta

Supongamos que tengo un T clase que quiero usar como una llave en una colección Dictionary<T,U>.

¿Qué debo poner en práctica en T para que estas claves se basan en los valores de T en lugar de referencias T?

Estoy esperando que es sólo GetHashCode().

¿Fue útil?

Solución

Debe implementar GetHashCode () y equals ().

diccionario es un Hashtable por debajo de las cubiertas, por lo que es posible que desee leer esto: trampas de Iguales / GetHashCode -? ¿Cómo funciona una tabla hash trabajo

Otros consejos

Si no se pasa ningún IEqualityComparer<T> en el constructor diccionario, se utilizará EqualityComparer<T>.Default que se define por MSDN como:

Los cheques propiedad predeterminada si escriba implementos T la System.IEquatable (Of T) interfaz y, si es así, devuelve una EqualityComparer (Of T) que utiliza esa aplicación. De otra manera, devuelve un EqualityComparer (Of T) que utiliza las anulaciones de las Object.equals y Object.GetHashCode proporcionan las T.

Así que la implementación de IEquatable<T> sería mi elección (si se implementa que también tiene sentido para Equals override y GetHashCode de todos modos).

O implementar Equals y GetHashCode o crear una adecuada IEqualityComparer<T> que tiene la forma correcta de coincidencia de igualdad para su mapa.

Yo más bien como la ruta IEqualityComparer<T>: en muchos casos, no hay una sola forma, obviamente, a la derecha de la igualdad - que desea objetos tratan como iguales en diferentes maneras dependiendo de la situación. En ese caso, una igualdad comparador costumbre es justo lo que necesita. Por supuesto, si hay es una operación de igualdad natural, tiene sentido para implementar IEquatable<T> en el tipo en sí ... si se puede. (Otro beneficio de IEqualityComparer<T> es que se puede aplicar para tipos que no tiene control.)

Necesita anular Equals(object obj) . Siempre se espera que implemente GetHashCode cuando se modifica Equals. Lea este artículo en MSDN.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top