C # sobrescribir equals y GetHashCode GetHashCode y es igual en C #

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

Supongo que te gusta

Origin www.cnblogs.com/Leo_wl/p/12448380.html
Recomendado
Clasificación