c# – ValueTypes的数组不喜欢object.Equals?
这让我把头发拉了几天:
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.我花了几天时间才注意到. byte是ValueType.但是,byte []是一个System.Array,它是一个引用类型.根据.NET文档:
有人可以帮忙吗? 解决方法
_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; } 你可以在循环中使用object.Equal,因为你可以比较Loop包含的ValueTypes. System.Threading.Tasks.Parallel的使用帮助我更快地移动事物. Parallel.For返回一个结构,告诉您循环是否已停止.如果你从未用loopState.Break停止循环,那么它们都匹配.如果由于某种原因,你不能使用Parallel.For,只需执行一个返回false的for循环; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |