En C # Iguales y GetHashCode
Iguales 和 GetHashCode
Es igual a cada aplicación debe seguir las siguientes convenciones:
- Reflexiva (reflexiva): x.equals (la dirección X) debe devolver verdadero.
- Simetría (la Symmetric): de x.equals (Y) es verdadera, y.equals (x) también es cierto.
- Transitividad (transitivo): Para cualquier aplicación de valores no nulos x, y y z, devuelve verdadero si x.equals (y) devuelve verdadero, y y.equals (z), entonces x.equals (z) deben volver verdadero .
- La consistencia (Consistencia): Si la comparación múltiple objeto a otro objeto, el resultado es siempre el mismo, siempre que el objeto de aplicación no modificada x e y, x.equals (Y) llamadas sucesivas x.equals (y) devuelve el mismo valor l. .
- No nulo (no nulo): Si x no es nulo, Y es nulo, x.equals (Y) debe ser falsa
GetHashCode:
- Dos objetos son iguales de acuerdo con el método equals de la comparación es igual, entonces los dos objetos a cualquier objeto un método deben producen el mismo número entero código hash.
- Cuando no se opone a modificar, utilizar varias llamadas para devolver el mismo número entero código hash. Ejecuta varias veces dentro de la misma aplicación, cada uno de los retornos de ejecución número entero pueden ser inconsistentes.
- Si dos objetos cuando los iguales método de comparación de acuerdo no iguales, entonces llamar a un método de hashcode dos objetos de ese objeto, con no un número entero. Sin embargo, diferentes objetos tienen diferentes números enteros, es posible mejorar el rendimiento de la tabla hash.
IEqualityComparer lograr
Vamos a crear una clase de estudiantes para lograr aún más nuestra comparación de datos de destino
public class Student
{
public string Name { get; set; } public int Age { get; set; } }
Obtendremos el siguiente método se filtró a través de un código distinto.
class Program
{
static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
Tenemos que lograr es ignorar el mismo objeto de datos, pero no cumplieron con los resultados de horario. Debido a que es distinta de comparación por defecto es una referencia al objeto ... así que de esta manera se llega a los resultados deseados. Luego modificamos para lograr nuestro esperada efecto.
Por Iguales por defecto tiene el siguiente comportamiento:
- Si la instancia es un tipo de referencia, el mismo, es igual volverán cierto sólo de referencia.
- Si la instancia es un tipo de valor, es el mismo, sólo que es igual a los rendimientos cierto sólo si el tipo y valor.
Distinct (IEnumerable, IEqualityComparer)
Mediante el uso de la IEqualityComparer especificado para comparar los valores, retorno a los elementos de secuencia no repetitivos.
tipo Parámetros
-
fuente TSource del tipo de elemento.
parámetros
- Fuente del IEnumerable eliminar la secuencia duplicado del elemento.
-
Comparador IEqualityComparer IEqualityComparer un valor de comparación.
regreso
- IEnumerable
una secuencia fuente IEnumerable que comprende elementos distintos.
Nos fijamos en el siguiente fragmento de código
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
Si los dos fragmentos de código por encima de los iguales GetHashCode devuelve verdadero y regresar el mismo código hash, a continuación, los dos objetos se consideran iguales.
Iguales anular y GetHashCode
var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
Después de ejecutar el código anterior fragmento resultado de resultados inesperados. Vamos a seguir para implementar el código para lograr los resultados deseados ....
public class Student
{
public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
A continuación, utilizamos LINQ distintos métodos de filtrado y consulta, y comprobaremos los Iguales y GetHashCode
List<Student> students = new List<Student>
{
new Student{ Name = "MR.A", Age = 32},
new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2
Autor: @ Feng Hui
Fuente: https://www.cnblogs.com/yyfh/p/12245916.html
Iguales 和 GetHashCode
Es igual a cada aplicación debe seguir las siguientes convenciones:
- Reflexiva (reflexiva): x.equals (la dirección X) debe devolver verdadero.
- Simetría (la Symmetric): de x.equals (Y) es verdadera, y.equals (x) también es cierto.
- Transitividad (transitivo): Para cualquier aplicación de valores no nulos x, y y z, devuelve verdadero si x.equals (y) devuelve verdadero, y y.equals (z), entonces x.equals (z) deben volver verdadero .
- La consistencia (Consistencia): Si la comparación múltiple objeto a otro objeto, el resultado es siempre el mismo, siempre que el objeto de aplicación no modificada x e y, x.equals (Y) llamadas sucesivas x.equals (y) devuelve el mismo valor l. .
- No nulo (no nulo): Si x no es nulo, Y es nulo, x.equals (Y) debe ser falsa
GetHashCode:
- Dos objetos son iguales de acuerdo con el método equals de la comparación es igual, entonces los dos objetos a cualquier objeto un método deben producen el mismo número entero código hash.
- Cuando no se opone a modificar, utilizar varias llamadas para devolver el mismo número entero código hash. Ejecuta varias veces dentro de la misma aplicación, cada uno de los retornos de ejecución número entero pueden ser inconsistentes.
- Si dos objetos cuando los iguales método de comparación de acuerdo no iguales, entonces llamar a un método de hashcode dos objetos de ese objeto, con no un número entero. Sin embargo, diferentes objetos tienen diferentes números enteros, es posible mejorar el rendimiento de la tabla hash.
IEqualityComparer lograr
Vamos a crear una clase de estudiantes para lograr aún más nuestra comparación de datos de destino
public class Student
{
public string Name { get; set; } public int Age { get; set; } }
Obtendremos el siguiente método se filtró a través de un código distinto.
class Program
{
static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
Tenemos que lograr es ignorar el mismo objeto de datos, pero no cumplieron con los resultados de horario. Debido a que es distinta de comparación por defecto es una referencia al objeto ... así que de esta manera se llega a los resultados deseados. Luego modificamos para lograr nuestro esperada efecto.
Por Iguales por defecto tiene el siguiente comportamiento:
- Si la instancia es un tipo de referencia, el mismo, es igual volverán cierto sólo de referencia.
- Si la instancia es un tipo de valor, es el mismo, sólo que es igual a los rendimientos cierto sólo si el tipo y valor.
Distinct (IEnumerable, IEqualityComparer)
Mediante el uso de la IEqualityComparer especificado para comparar los valores, retorno a los elementos de secuencia no repetitivos.
tipo Parámetros
-
fuente TSource del tipo de elemento.
parámetros
- Fuente del IEnumerable eliminar la secuencia duplicado del elemento.
-
Comparador IEqualityComparer IEqualityComparer un valor de comparación.
regreso
- IEnumerable
una secuencia fuente IEnumerable que comprende elementos distintos.
Nos fijamos en el siguiente fragmento de código
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
Si los dos fragmentos de código por encima de los iguales GetHashCode devuelve verdadero y regresar el mismo código hash, a continuación, los dos objetos se consideran iguales.
Iguales anular y GetHashCode
var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
Después de ejecutar el código anterior fragmento resultado de resultados inesperados. Vamos a seguir para implementar el código para lograr los resultados deseados ....
public class Student
{
public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
A continuación, utilizamos LINQ distintos métodos de filtrado y consulta, y comprobaremos los Iguales y GetHashCode
List<Student> students = new List<Student>
{
new Student{ Name = "MR.A", Age = 32},
new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2
Autor: @ Feng Hui
Fuente: https://www.cnblogs.com/yyfh/p/12245916.html