C#中两个结构的相等性我正在寻找此结构的两个实例之间的相等性。publicstructSerie{T[]X;双[]Y;publicSerie(T[]x,double[]y){X=x;Y=Y;}publicoverrideboolEquals(objectobj){returnobjisSerie&&this==(Serie)obj;}publicstaticbooloperator==(Series1,Series2){returns1.X==s2.X&&s1.Y==s2.Y;}publicstaticbooloperator!=(Series1,Series2){return!(s1==s2);这行不通。我错过了什么?双[]xa={2,3};双[]ya={1,2};双[]xb={2,3};双[]yb={1,2};SerieA=newSerie(xa,ya);意甲B=新意甲(xb,yb);Assert.AreEqual(A,B);您正在比较数组引用而不是它们的内容。ya和yb指的是不同的数组。如果你想检查数组的内容,你必须明确地这样做。我不认为框架中有任何东西可以帮助你做到这一点,我很担心。像这样的东西应该可以工作:publicstaticboolArraysEqual(T[]first,T[]second){if(first==second){returntrue;}if(first==null||second==null){returnfalse;}if(first.Length!=second.Length){returnfalse;}IEqualityComparer比较器=EqualityComparer.Default;for(inti=0;i另外,你的结构有点可变,因为在创建结构后可以更改数组内容。你真的需要这个结构吗?编辑:正如尼克在评论中提到的,你也应该重写GetHashCode。同样,您需要从数组中获取内容(同样,如果数组之后发生更改,这将导致问题)。类似的实用方法:publicstaticintGetHashCode(T[]array){if(array==null){return0;}IEqualityComparercomparer=EqualityComparer.Default;inthash=17;foreach(Titeminarray){hash=hash*31+comparer.GetHashCode(item);}returnhash;}我觉得没什么在帮助你做到这一点的框架中,我担心在4.0中,有:在您的结构上实现IEquatable接口,因为这在某些情况下可以防止装箱/拆箱问题。http://blogs.msdn.com/jaredpar/archive/2009/01/15/if-you-implement-iequatable-t-you-still-must-override-object-s-equals-and-gethashcode.aspx部分s1.Y==s2.Y测试它们是否是对同一数组实例的2个引用,而不是内容相等。所以尽管有标题,这个问题实际上是关于数组之间的相等性(-reference)。一些额外的建议:由于您正在重载,因此您应该将Serie设计为不可变的,因为我会将嵌入式数组设为类而不是结构。调用==对数组执行引用相等-它们不比较元素的内容。这基本上意味着a1==a2只会在完全相同的实例时返回true-我认为这不是你想要的。你需要修改你的运算符==来承载x数组的内容,而不是它的引用。如果您使用的是.NET3.5(带有链接),您可以这样做:publicstaticbooloperator==(Series1,Series2){return((s1.X==null&&s2.X==null)||s1.X.SequenceEquals(s2.X))&&s1.Y==s2.Y;如果需要深度比较(超出引用),可以为SequenceEquals提供类型为T的自定义IEqualityComparer。您可能还应该考虑为您的结构实现IEquatable接口。它将帮助您的代码更好地与LINQ和执行对象比较的.NET框架的其他部分一起工作。您可以为结构创建私有访问器并使用CollectionAssert:[TestMethod()]publicvoidSerieConstructorTest(){double[]xa={2,3};双[]ya={1,2};双[]xb={2,3};双[]yb={1,2};varA=newSerie_Accessor(xa,ya);varB=newSerie_Accessor(xb,yb);CollectionAssert.AreEqual(AX,BX);集合断言。相等(AY,BY);这段代码工作正常。参考资料:以上就是《C#学习教程:C#中两种结构的平等共享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
