BoolList检查列表中的每一项是否为假我有一个包含很多值的List。检查列表中的每一项是否等于false的最有效方法是什么?我同意使用IEnumerable.Any/All。但是,我不同意当前投票最多的答案(在撰写本文时是错误的)以及AnyvsAll的一些相关评论。以下操作在语义上是等价的。请注意,否定在内部应用于谓词和操作结果。!l.Any(x=>f(x))l.All(x=>!f(x))现在,在这种情况下,我们正在寻找:不存在真值的情况。!l.Any(x=>x)//f(x)=x==true或,其中每个值都不为真。l.All(x=>!x)//f'(x)=!f(x)=!(x==true)空列表没有什么特别的,结果是一样的:例如!empty.Any(..)是假的,因为它是empty.All(..)并且上面的等价关系仍然有效。此外,这两种形式都是延迟求值的,需要在LINQToObjects中进行相同数量的求值;在内部,对于序列实现,区别只是否定对谓词和结果值的检查。您可以使用Enumerable.Any它会在第一场比赛中找到令人满意的条件。正如Habib正确地说最好将Any用作Enumerable.All将为空列表bool返回true。!lst.Any(c=>c==true);或者使用Enumerable.Alllst.All(c=>c==false);一个显着更快的解决方案,这里没有提到,使用Containsif(!myList.Contains(true))//非常成功-所有值都是false!从逻辑上讲,这种技术应该比IEnumerable.All更快,因为它在第一次出现时返回true。我刚刚与IEnumerable.Any进行了比较,它明显更快。在我的测试中,IEnumerable.All执行与IEnumerable.Any相同的操作,可能在幕后对这两个函数使用了类似的算法。我还检查了IEnumerable.Exists,它的性能优于IEnumerable.Any和IEnumerable.All,但仍比Contains慢。在10000000个bool条目的列表中(我也尝试了具有类似结果的0和1个条目),我想出了以下指标:PassedAny=95msPassedAllPassed=88msPassedPresence=27msPassedContains=17msContainsRatioAny~5.59倍快!使用以下代码进行测试://设置初始变量varmyList=newList();对于(intx=0;xx);sw.停止();//获取Any的结果vartimeAny=sw.ElapsedMilliseconds;//重置变量状态(以防万一它影响任何东西)containsAllFalse=false;//开始测试2sw.Restart();containsAllFalse=myList.All(x=>x==false);sw.停止();//获取所有的结果vartimeAll=sw.ElapsedMilliseconds;//重置变量状态(以防万一它影响任何东西)containsAllFalse=false;//开始测试3sw.Restart();containsAllFalse=!myList.Exists(x=>x==true);sw.停止();//获取所有的结果vartimeExists=sw.ElapsedMilliseconds;//重置变量状态(以防万一它影响任何东西)containsAllFalse=false;//开始测试4sw.Restart();containsAllFalse=!myList.Contains(true);sw.停止();//从ContainsvartimeCont获取结果ains=sw.ElapsedMilliseconds;//打印结果varpercentFaster=Math.Round((double)timeAny/timeContains,2);Console.WriteLine("经过任何时间={0}ms",timeAny);Console.WriteLine("经过全部={0}ms",timeAll);Console.WriteLine("经过Exists={0}ms",timeExists);Console.WriteLine("经过Contains={0}ms",timeContains);Console.WriteLine("Contains比Any快~{0}x!",percentFaster);请注意,这仅适用于只能具有2个状态的类型(即它不会处理具有>2个状态的变量,例如Nullable)您可以使用LINQ的All方法:list.All(x=>x==false);如果它找到一个等于true的值,它会立即返回false是false分享的全部内容,如果对你有用,需要了解更多C#学习教程,希望你多多关注-这篇文章收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
