测试两个IEnumerables是否具有相同的值和相同的频率我有两个多字节,都是IEnumerables,我想比较它们。string[]names1={"tom","dick","harry"};string[]names2={"tom","dick","harry","harry"};string[]names3={"tom","dick","harry","sally"};string[]names4={"dick","harry","tom"};希望names1==names4返回true(并且self==self显然返回true)但所有其他组合返回错误。什么是最有效的方法?这些可以是大型复杂对象。我看着做:vara=name1.orderby(v=>v.Name);varb=name4.orderby(v=>v.Name);返回一个==b;最有效的方法取决于数据类型。一个非常短且相当有效的O(N)解决方案如下:varlist1Groups=list1.ToLookup(i=>i);varlist2Groups=list2.ToLookup(i=>i);返回list1Groups.Count==list2Groups.Count&&list1Groups.All(g=>g.Count()==list2Groups[g.Key].Count());这些项目必须具有有效的Equals和GetHashcode实现。如果你想要一个更快的解决方案,下面的cdhowie解决方案在10000个元素时相对较快,并且对于简单对象的大型集合要快5倍——可能是由于更好的内存效率。最后,如果您真的对性能感兴趣,我肯定会尝试Sort-then-SequenceEqual方法。虽然它的复杂性更差,但这只是一个logN因子,并且肯定会被所有真实数据集大小的恒定差异所淹没-你可能能够就地排序,使用数组甚至升序排序(这可以是线性的)。即使有40亿个元素,log-base-2也只有32;这是一个相关的性能差异,但可以想象,常数因子的差异可能更大。例如,如果您正在处理整数数组并且不介意修改集合顺序,则以下方法比任一选项都快,即使对于10000000项(低于两次,我得到32位OutOfMemory):Array.Sort(列表1);数组排序(list2);返回list1.SequenceEqual(list2);YMMV取决于机器、数据类型、月球周期和其他影响微基准的常见因素。先排序,再使用Enumerable.SequenceEqual。如果类型实现IEquatable或重写Equals,则可以使用第一个重载;否则您将不得不使用第二种形式并提供您自己的IEqualityComparer。因此,如果您的类型确实实现了相等性,那么只需:returna.SequenceEqual(b);这是另一个更快、更安全、无排序的选项:}publicstaticboolUnsortedSequencesEqual(这个IEnumerable第一,IEnumerable第二,IEqualityComparer比较器){if(first==null)thrownewArgumentNullException("first");==if(second)抛出新的ArgumentNullException("second");varcounts=newDictionary(比较器);foreach(variinfirst){intc;if(counts.TryGetValue(i,outc))counts[i]=c+1;否则计数[i]=1;}foreach(variinsecond){intc;如果(!counts.TryGetValue(i,outc))返回false;如果(c==1)counts.Remove(i);否则计数[i]=c-1;}返回计数。Count==0;您可以使用二叉搜索树来确保数据已排序。这将使它成为一个O(logN)操作。然后,您可以一次遍历每棵树一个项目,并在发现不相等条件时立即中断。这也将为您带来额外的好处,即能够首先比较两棵树的大小,因为重复项将被过滤掉。我假设这些被视为集合,其中{"harry","harry"}=={"harry")。如果要计算重复项,则先进行快速排序或归并排序,然后将比较操作设为O(N)操作。您当然可以先比较大小,因为如果大小不同,则两个枚举不可能相等。由于数据已排序,您遇到的第一个不相等条件将使整个操作呈现为“不相等”。@cdhowie的回答很好,但是这里有一个很好的技巧,它通过将分解参数的值与之前的IEnumerable进行比较来更好地声明.Count的类型。除了他的解决方案之外,只需将此添加到您的代码中:以上都是C#学习教程:测试两个IEnumerables是否具有相同的值和相同的频率共享,如果它对你们有用并且需要了解更多关于C#学习的信息教程,希望大家多多关注——}返回UnsortedSequencesEqual((IEnumerable)第一,(IEnumerable)第二,比较器);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
