En Java, Arrays.equals()
permite comparar fácilmente el contenido de dos matrices básicas (hay sobrecargas disponibles para todos los tipos básicos).
¿Existe tal cosa en C #? ¿Hay alguna forma "mágica" de comparar el contenido de dos matrices en C #?
Respuestas:
Podrías usar
Enumerable.SequenceEqual
. Esto funciona para cualquierIEnumerable<T>
, no solo matrices.fuente
SequenceEqual
puede que no sea una buena elección en cuanto al rendimiento, porque su implementación actual puede enumerar completamente una de sus fuentes si difieren solo en longitud. Con las matrices,Length
primero podríamos verificar la igualdad, para evitar enumerar matrices de diferentes longitudes solo para terminar rindiendofalse
.Usar
Enumerable.SequenceEqual
en LINQ .fuente
new int[] {1}.SequenceEquals(null) == false
También para matrices (y tuplas) puede usar nuevas interfaces de .NET 4.0: IStructuralComparable e IStructuralEquatable . Al usarlos, no solo puede verificar la igualdad de las matrices sino también compararlas.
fuente
a.StructuralCompare(b)
?Para .NET 4.0 y superior, puede comparar elementos en una matriz o tuplas mediante el uso del tipo StructuralComparisons :
fuente
SequenceEqual
solo volverá verdadero si se cumplen dos condiciones o se cumplen.Si solo desea verificar si contienen los mismos elementos independientemente de su orden y si su problema es del tipo
puede usar el método de extensión LINQ
Enumerable.Except
y luego verificar si el resultado tiene algún valor. Aquí hay un ejemploY también al usar esto obtienes los diferentes elementos también automáticamente. Dos pájaros con una piedra.
Tenga en cuenta que si ejecuta su código así
Obtendrás diferentes resultados.
En mi caso, tengo una copia local de una matriz y quiero verificar si se ha eliminado algo de la matriz original, así que utilizo este método.
fuente
SequenceEqual
.Para pruebas unitarias, puede usar en
CollectionAssert.AreEqual
lugar deAssert.AreEqual
.Es probablemente la forma más fácil.
fuente
Si desea manejar las
null
entradas con gracia e ignorar el orden de los elementos, pruebe la siguiente solución:El código de prueba se ve así:
fuente
a1 = { 1, 1 }
ya2 = { 1, 2 }
, entonces, la primera prueba devuelve el resultado incorrecto. La declaración de devolución debe serreturn array1.Count() == array2.Count() && !array1.Except(array2).Any() && !array2.Except(array1).Any();
Para algunas aplicaciones puede ser mejor:
fuente
Esta solución LINQ funciona, no estoy seguro de cómo se compara en rendimiento con SequenceEquals. Pero maneja diferentes longitudes de matriz y .All saldrá en el primer elemento que no es igual sin iterar a través de toda la matriz.
fuente
¿Comparar elementos? qué pasa
Reemplace la condición (a == b) por cualquier cosa que desee comparar en ay b.
(esto combina dos ejemplos de ejemplos de Linq para desarrolladores de MSDN )
fuente
true
) ynull
matrices (se bloqueará).Lo hice en estudios visuales y funcionó perfectamente; comparar matrices índice por índice con este código corto.
la salida será; Los números coincidentes son 7 Los números no coincidentes son 3
fuente
null
matrices (también se bloqueará), y hace algo más de lo que pidió el OP. Solo pidió conocer la igualdad, sin contar cuántos elementos difieren o coinciden.Suponiendo que la igualdad de matriz significa que ambas matrices tienen elementos iguales en índices iguales, existe la
SequenceEqual
respuesta y laIStructuralEquatable
respuesta .Pero ambos tienen inconvenientes, en cuanto al rendimiento.
SequenceEqual
La implementación actual no será un atajo cuando las matrices tengan diferentes longitudes, por lo que puede enumerar una de ellas por completo, comparando cada uno de sus elementos.IStructuralEquatable
no es genérico y puede causar el encajonamiento de cada valor comparado. Además, no es muy fácil de usar y ya requiere codificar algunos métodos auxiliares para ocultarlo.Puede ser mejor, en cuanto al rendimiento, usar algo como:
Pero, por supuesto, esa tampoco es una "forma mágica" de verificar la igualdad de la matriz.
Entonces, actualmente, no, no hay realmente un equivalente a Java
Arrays.equals()
en .Net.fuente
null
. ¿Cuál es tu punto?