equalsignorecase comparar cadena c# equals

c# - comparar - ¿Por qué hay un método igual para los conjuntos?



string.compare c# (7)

En C Sharp .NET hay un método Equals y un método SetEquals . ¿Dónde está la diferencia?

Viniendo de Java, mi primer pensamiento fue que SetEquals no es necesario, solo use el método Equals para todos los objetos.


La implementación de msdn.microsoft.com/en-us/library/dd412096.aspx

Determina si el conjunto actual y la colección especificada contienen los mismos elementos.

La implementación de Equals heredada de un object

es equivalente a una llamada al método ReferenceEquals.

La implementación heredada de ReferenceEquals ,

Determina si las instancias de objetos especificadas son la misma instancia.

En particular, tenga en cuenta que la IEnumerable<T> pasada a SetEquals podría tener una o más instancias de cada miembro del conjunto, en cualquier orden, y SetEquals aún devolvería verdadero.

Si desea confirmar que dos secuencias contienen exactamente los mismos miembros en el mismo orden, puede usar la extensión SequenceEqual .


SetEquals:

Comprueba si el HashSet contiene los mismos elementos que un IEnumerable <T> dado.

El método SetEquals trata la segunda colección como si no tuviera elementos duplicados. Si hay elementos duplicados presentes, las dos colecciones aún pueden considerarse iguales.

Es igual a

Igual es en realidad una prueba referencial.

List<string> stringList = new List<string> { "a", "b", "c" }; SortedSet<string> stringSet = new SortedSet<string> { "a", "b", "c" }; bool a = stringSet.SetEquals(stringList ); // See if the two collections contain the same elements.


Equals controles Equals para la igualdad de referencia entre los dos y SetEquals comprobarán los elementos en la colección.


HashSet<T>.SetEquals determina si el HashSet contiene los mismos elementos que un IEnumerable<T> dado. Pero, ¿por qué debería ser verdadero si los tipos son diferentes?

HashSet<int> h = new HashSet<int>(); h.Add(0); h.Add(1); int[] ints = new[] { 0, 1, 1, 0 }; h.SetEquals(ints); // true, ignores duplicates because it''s a set h.Equals(ints); // false, correct because not even the same types

MSDN :

El método SetEquals ignora las entradas duplicadas y el orden de los elementos en el otro parámetro ...

Dado que HasetSet<T> no reemplaza a Equals , utiliza el heredado de un objeto que solo compara las referencias. Entonces, si dos objetos no son la misma referencia, devuelve false .


SetEquals no obedece el mismo contrato que Equals . En particular, no es simétrico, ya que el argumento es solo IEnumerable<T> lugar de ISet<T> . Esto le permite verificar la igualdad del conjunto mientras solo tiene un conjunto. Considerar:

List<int> intList = new List<int> { 1, 2, 3 }; HashSet<int> intSet = new HashSet<int>(intList);

Ahora podemos usar:

Console.WriteLine(intSet.SetEquals(intList));

... pero no pudimos implementar Equals de la misma manera sin imponer el mismo comportamiento en List<int> y en todas las demás IEnumerable<T> .

Incluso si lo restringimos a otros conjuntos, existe la interesante pregunta de qué significa realmente la igualdad. Por ejemplo, considere dos conjuntos HashSet<string> que contienen las mismas cadenas, pero tienen diferentes comparadores de igualdad. (Tal vez uno distingue entre mayúsculas y minúsculas y otro no). ¿Son iguales o no? SetEquals logra evitar tales preguntas filosóficas al evitar tratar de ser demasiado general.

¿Qué pasa con un HashSet<int> y un SortedSet<int> ? ¿Podrían ser iguales alguna vez? Pueden tener los mismos valores, pero el orden de uno no está definido.

En general, las ideas de Object.Equals y Object.GetHashCode son demasiado amplias en mi opinión. A menudo, usted desea un tipo particular de igualdad y, en primer lugar, no tiene sentido comparar los objetos para la igualdad. Esto podría fácilmente ser el tema de una perorata completamente diferente, pero mientras tanto me alegro de que .NET no haya intentado aplicar esta idea demasiado amplia a las colecciones. La capacidad de usar SetEquals con un significado bien definido es más útil, IMO.


public static void Main(string[] args) { Console.WriteLine("Hello World!"); System.Collections.Generic.HashSet<int> setA= new System.Collections.Generic.HashSet<int>(); setA.Add(1); System.Collections.Generic.HashSet<int> setB= new System.Collections.Generic.HashSet<int>(); setB.Add(1); Console.WriteLine("Equals method returns {0}", setA.Equals(setB)); Console.WriteLine("SetEquals method returns {0}", setA.SetEquals(setB)); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); }

Produce salida: el método Equals devuelve el método False SetEquals devuelve True

El método de igualdad, por lo tanto, parece ser una prueba de igualdad referencial.


  • Equals probaría si dos HashSet son el mismo objeto.
  • MSDN toma un IEnumerable<T> , lo que hace es: "El método SetEquals ignora las entradas duplicadas y el orden de los elementos en el otro parámetro".

Entonces, SetEquals es para pruebas para ver si cargó un IEnumerable en un HashSet, generaría el mismo HashSet que su fuente.