在C#中检查两个列表是否相等的最佳方法是什么?有很多方法可以做到这一点,但我觉得我缺少一个功能或其他东西。显然List==List将使用Object.Equals()并返回false。如果列表中的每个元素都相等并且出现在相反列表中的相同位置,那么我认为它们相等。我正在使用值类型,但正确实现的数据对象应该以相同的方式工作(即我不是在寻找浅表副本列表,只是内部每个对象的相同值)。我试过搜索,也有类似的问题,但我的问题是每个元素的确切顺序都是相等的。Enumerable.SequenceEqualMSDN邪恶的实现是if(List1.Count==List2.Count){for(inti=0;i我把这个变体放在一起:privateboolAreEqual(Listx,Listy){//相同的列表或两者都为空if(x==y){returntrue;}//一个为空(但另一个不是)if(x==null||y==null){returnfalse;}//计数不同;他们不等于if(x.Count!=y.Count){returnfalse;}for(inti=0;我的书呆子也爬出来了所以我在SequenceEquals上做了一个性能测试,这个有一点优势。现在,要问的问题;这种微小的、几乎可以衡量的性能提升是否值得将代码添加到代码库并进行维护?我很怀疑;o)我敲了一个快速扩展方法:for(vari=0;我可以为序列写一个通用的IEqualityComparer。一个简单的:(IEnumerableobj){returnunchecked(obj.Aggregate(397,(x,y)=>x*31+y.GetHashCode()));}}一个更充实的版本:应该表现更好。公共类SequenceEqualityComparer:EqualityComparer>,IEquatable>{只读IEqualityComparer比较器;publicSequenceEqualityComparer(IEqualityComparercomparer=null){this.comparer=comparer??EqualityComparer.Default;}publicoverrideboolEquals(IEnumerablex,IEnumerabley){//使用ReferenceEquals更安全,因为==可以被覆盖if(ReferenceEquals(x,y))returntrue;如果(x==null||y==null)返回false;varxICollection=x作为ICollection;if(xICollection!=null){varyICollection=yasICollection;如果(yICollection!=null){如果(xICollection.Count!=yICollection.Count)返回false;varxIList=xasIList;if(xIList!=null){varyIList=yasIList;if(yIList!=null){//优化-从底部开始循环for(inti=xIList.Count-1;i>=0;i--)if(!comparer.Equals(xIList[i],yIList[i]))返回假;返回真;}}}}返回x.SequenceEqual(y,比较器);}publicoverrideintGetHashCode(IEnumerablesequence){unchecked{inthash=397;foreach(variteminsequence)hash=hash*31+comparer.获取哈希码(项目);返回散列;}}publicboolEquals(SequenceEqualityComparerother){if(ReferenceEquals(null,other))returnfalse;如果(ReferenceEquals(this,other))返回true;返回这个。比较器。等于(其他。比较器);}publicoverrideboolEquals(objectobj){returnEquals(objasSequenceEqualityComparer);覆盖intGetHashCode(){returncomparer.GetHashCode();这有一些功能:比较是自下而上完成的在典型的用例中,最终集合更有可能。可以传递IEqualityComparer来比较集合中的项目。使用linqSequenceEqual检查序列相等性,因为Equals方法检查引用相等性。boolisEqual=list1.SequenceEqual(list2);SequenceEqual()方法将第二个IEnumerable序列作为参数,并与目标(第一个)序列执行逐个元素比较。如果两个序列包含相同数量的元素,并且第一个序列中的每个元素都等于第二个序列中的对应元素(使用默认相等比较器),则SequenceEqual()返回true。否则,返回假。或者,如果您不关心元素顺序,请使用Enumerable.All方法:varisEqual=list1.All(list2.Contains);第二个版本还需要对Count进行另一次检查,因为即使list2包含的元素多于list1,它也会返回true。以上是C#学习教程:C#中检查两个List列表是否相等的最好方法是什么?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
