.NET可以测试数组的等价性而不仅仅是相等的引用吗?

dlr*_*as2 6 .net arrays equals

var a = new double[] {1, 2, 3};
var b = new double[] {1, 2, 3};
System.Console.WriteLine(Equals(a, b)); // Returns false
Run Code Online (Sandbox Code Playgroud)

但是,我正在寻找一种比较数组的方法,它可以比较内部值而不是参考值.是否有内置的方法在.NET中执行此操作?

此外,虽然我理解Equals比较引用,但也GetHashCode返回这两个数组的不同值,我觉得不应该发生,因为它们具有相同的内部值.

Jos*_*osh 7

我相信你正在寻找这种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
Run Code Online (Sandbox Code Playgroud)

至于GetHashCode返回不同​​值的问题,请记住您在这里处理两个不同的值.您不是在比较数组,而是在比较两个对数组的引用.

引用类型的默认相等比较需要保持一致.如果您还需要其他东西,请记住有一个内置模型,使用IEqualityComparer<T>它可以根据不符合标准参考相等模式的特定需求定义自定义相等比较.


E.Z*_*art 5

更新:修复了使用正确比较方法的代码(感谢@CodesInChaos指出这一点).

如果您使用的是.NET 4,则可以使用IStructuralEquatable接口:

IStructuralEquatable c = b;
Console.WriteLine(c.Equals(a, StructuralComparisons.StructuralEqualityComparer));
Run Code Online (Sandbox Code Playgroud)

这个问题有更多细节.