2011-04-28 6 views
6
var a = new double[] {1, 2, 3}; 
var b = new double[] {1, 2, 3}; 
System.Console.WriteLine(Equals(a, b)); // Returns false 

Sin embargo, estoy buscando una manera de comparar matrices que compararían los valores internos en lugar de las referencias. ¿Existe una forma integrada de hacerlo en .NET?¿Puede .NET probar matrices para equivalencia y no solo referencias iguales?

Además, si bien entiendo Equals comparando referencias, GetHashCode también devuelve valores diferentes para estas dos matrices, lo cual creo que no debería ocurrir, ya que tienen los mismos valores internos.

+1

'GetHashCode' devuelve valores diferentes porque son objetos diferentes y, por lo tanto, pueden utilizarse como claves en un diccionario o tabla hash, por lo que idealmente deberían ubicarse en diferentes sectores. – Justin

Respuesta

7

Creo que está buscando el método Enumerable.SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>).

var a = new double[] {1, 2, 3}; 
var b = new double[] {1, 2, 3}; 
System.Console.WriteLine(a.SequenceEqual(b)); // Returns true 

En cuanto al problema con GetHashCode la devolución de valores diferentes, recuerda que se trata de dos valores distintos aquí. No está comparando matrices, está comparando dos referencias a matrices.

La comparación de igualdad predeterminada para los tipos de referencia debe ser coherente. Si necesita que ocurra algo más, recuerde que hay un modelo incorporado para eso que usa IEqualityComparer<T> que le permite definir una comparación de igualdad personalizada basada en necesidades específicas que no siguen el patrón de igualdad de referencia estándar.

5

ACTUALIZACIÓN: Se corrigió el código para utilizar el método de comparación correcto (gracias a @CodesInChaos para señalarlo).

Si estás en .NET 4, puede utilizar la interfaz IStructuralEquatable:

IStructuralEquatable c = b; 
Console.WriteLine(c.Equals(a, StructuralComparisons.StructuralEqualityComparer)); 

Este question tiene más detalle.

+0

Gracias, 'StructuralComparisons.StructuralEqualityComparer.Equals (a, b)' es lo que estaba buscando (donde 'a' y' b' son del tipo 'System.Array'). – EM0

Cuestiones relacionadas