ValueTypes数组;t喜欢的对象.等于
本文关键字:对象 等于 喜欢 数组 ValueTypes | 更新日期: 2023-09-27 18:29:46
这让我拔了几天头发:
byte[] _A = new byte[64];
// Fill _A with some meaningful, valid data.
byte[] _B = new byte[_A.Length];
_A.CopyTo( _B, 0 );
if( !_A.Equals( _B ) ) {
throw new WtfException(
"It appears object.Equals doesn't work on arrays of value types...");
}
是的,这抛出了WtfException
。我花了几天时间才注意到。2是CCD_ 3。然而,byte[]
是System.Array
,CCD_5是引用类型。根据.NET文档:
Equals的默认实现支持的引用相等引用类型以及值类型的逐位相等。参考相等意味着被比较的对象引用引用相同的对象。逐位相等意味着被比较的对象具有相同的二进制表示。
有人能帮忙吗?
您比较的是引用类型(数组),而不是值类型_A和_B确实不同——它们是两个不同的数组,恰好包含相同的值。
_A和_B不是对同一数组的引用。因此,它们是不平等的。你需要做这样的东西:
private static bool ValueTypeArraysAreEqual( Array p_lhs, Array p_rhs ) {
if( p_lhs == null ) {
return p_rhs == null;
}
if( p_rhs == null ) {
return false;
}
if( p_lhs.Length != p_rhs.Length ) {
return false;
}
return Parallel.For( 0, p_lhs.Length, ( _lcv, loopState ) => {
if( !p_lhs.GetValue( _lcv ).Equals( p_rhs.GetValue( _lcv ) ) ) {
loopState.Break();
}
} ).IsCompleted;
}
您可以使用对象。循环中相等,因为您可以比较循环包含的ValueTypes。System.Threading.Tasks.Parallel的使用帮助我更快地处理事情。Parallel.For返回一个结构,该结构告诉循环是否已暂停。如果你从未用loopState.Break停止循环,那么它们都匹配。如果由于某种原因,您不能使用Parallel.for,只需执行一个返回false的for循环;
数组使用引用相等,而不是成员相等。因此,这与预期的一样。
如果需要,可以使用SequenceEqual
实现成员相等。
该文档准确地解释了您所看到的内容。可怕的类比警告:仅仅因为两张纸上都写着相同的数字,并不能使它们成为同一张纸。
您可能对SequenceEqual
感兴趣,它将返回true
,当且仅当两个序列以相同的顺序包含相同的值时。