Bool列表检查列表中的每个项目是否为false

jac*_*obz 31 c# boolean list

我有List<bool>很多价值观.检查列表中每个项目是否等于的最有效方法是什么false

Adi*_*dil 37

您可以使用Enumerable.Any它将在第一场比赛中找到满足条件.正如Habib正确地说更好地使用Any作为Enumerable.All将返回true为空列表bool.

!lst.Any(c=> c == true);
Run Code Online (Sandbox Code Playgroud)

或者使用Enumerable.All

lst.All(c=> c == false);
Run Code Online (Sandbox Code Playgroud)

  • +1,最好使用`Any`,因为`Enumerable.All`会返回一个空列表bool的'true`. (5认同)

use*_*740 17

我同意使用IEnumerable.Any/All.但是,我不同意目前投票最多的答案(在撰写本文时这是错误的)以及Any vs All的一些相关评论.

以下操作在语义上是等效的.需要注意的是否定应用内,谓词,并且在操作的结果.

!l.Any(x => f(x))
l.All(x => !f(x))
Run Code Online (Sandbox Code Playgroud)

现在,在这种情况下,我们正在寻找:

如果存在任何真实价值的情况.

!l.Any(x => x)  // f(x) = x == true
Run Code Online (Sandbox Code Playgroud)

或者,

情况是每个价值都不是真的.

l.All(x => !x)  // f'(x) = !f(x) = !(x == true)
Run Code Online (Sandbox Code Playgroud)

对于空列表没有什么特别之处,结果是相同的:例如,它!empty.Any(..)是假的,原样empty.All(..)并且上述等价关系保持有效.

此外,两种形式都经过延迟评估,并且在LINQ To Objects中需要相同数量的评估; 在内部,对于序列实现,差异仅仅是否定对谓词和结果值的检查.


Chi*_*eet 7

一个明显更快的解决方案,这里没有提到,正在使用 Contains

if (!myList.Contains(true))
    // Great success - all values false! 
Run Code Online (Sandbox Code Playgroud)

我比较Contains反对IEnumerable.AnyContains返回速度更快.在我的测试中IEnumerable.All执行的相同IEnumerable.Any,也许类似的算法用于引擎盖下的这两个功能.我还检查了IEnumerable.Exists哪个表现优于IEnumerable.AnyIEnumerable.All,但仍然慢于Contains.

在10,000,000个bool条目的列表中(我还尝试了0和1个条目,结果相似),我想出了以下指标:

通过Any = 95ms经过

全部通过= 88ms

经过的存在= 27ms

经过包含 = 17ms

包含比任何快〜5.59倍!

使用以下代码进行测试:

// setup initial vars
var myList = new List<bool>();
for (int x = 0; x < 10000000; x++)
    myList.Add(false);  

var containsAllFalse = false;
Stopwatch sw = new Stopwatch();

// start test
sw.Start();
containsAllFalse = !myList.Any(x => x);
sw.Stop();

// get result for Any
var timeAny = sw.ElapsedMilliseconds;

// reset variable state (just in case it affects anything)
containsAllFalse = false;   

// start test 2
sw.Restart();
containsAllFalse = myList.All(x => x == false);
sw.Stop();

// get result for All
var timeAll = sw.ElapsedMilliseconds;

// reset variable state (just in case it affects anything)
containsAllFalse = false;   

// start test 3
sw.Restart();
containsAllFalse = !myList.Exists(x => x == true);
sw.Stop();

// get result for All
var timeExists = sw.ElapsedMilliseconds;

// reset variable state (just in case it affects anything)
containsAllFalse = false;   

// start test 4
sw.Restart();   
containsAllFalse = !myList.Contains(true);          
sw.Stop();

// get result from Contains
var timeContains = sw.ElapsedMilliseconds;

// print results
var percentFaster = Math.Round((double)timeAny / timeContains, 2);
Console.WriteLine("Elapsed via Any = {0}ms", timeAny);
Console.WriteLine("Elapsed via All = {0}ms", timeAll);
Console.WriteLine("Elapsed via Exists = {0}ms", timeExists);
Console.WriteLine("Elapsed via Contains = {0}ms", timeContains);
Console.WriteLine("Contains is ~{0}x faster than Any!", percentFaster);
Run Code Online (Sandbox Code Playgroud)

请注意,这只适用于类型只能有两种状态的类型(即它不会工作> 2状态的变量,例如Nullable<bool>)