Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 布尔数组的值_C# - Fatal编程技术网

C# 布尔数组的值

C# 布尔数组的值,c#,C#,有没有办法检查布尔数组是否只包含真(或假)值,或者我需要像这样逐值检查它 for (int k = 0; k < 9; k++) { if (CheckPart[k] == false) Checked = false; } for(int k=0;k

有没有办法检查布尔数组是否只包含真(或假)值,或者我需要像这样逐值检查它

for (int k = 0; k < 9; k++)
{
   if (CheckPart[k] == false) Checked = false;
}
for(int k=0;k<9;k++)
{
如果(CheckPart[k]==false)Checked=false;
}

我知道这很简单而且有效,但只是出于好奇。

如果所有元素都为真,则以下内容将返回真,否则将返回假:

var Checked = CheckedPart.All(p => p);
只要使用LINQ

Checked = CheckedPart.All(x => x);
怎么样?这将返回
boolean

bool Checked = CheckPart.All(p => p);
确定序列的所有元素是否满足条件。 此方法不会返回集合的所有元素。相反,它确定集合的所有元素是否满足一个条件

这是一个

或者更简单:

Checked = !CheckPart.Any(q => q == false);
替代方法(不含LINQ):

Boolean allAreTrue=true;
对于(变量i=0;i
或者,使用扩展方法:

public static class BooleanExtender
{
    public static Boolean AllAreFalse(this Boolean[] items)
    {
        for (var i = 0; i < items.Length; i++)
            if (items[i]) return false;
        return true;
    }

    public static Boolean AllAreTrue(this Boolean[] items)
    {
        for (var i = 0; i < items.Length; i++)
            if (!items[i]) return false;
        return true;
    }
}

new Boolean[]{ ... }.AllAreTrue();
new Boolean[]{ ... }.AllAreFalse();
公共静态类BooleanExtender
{
公共静态布尔AllarFalse(此布尔[]项)
{
对于(变量i=0;i
您可以通过多种方式实现这一点,但都是一样的。你的方式是正确的。您可以在找到
false
元素后中断循环。即使数组上有一个单行方法,它的实现仍然需要线性时间才能找到结果…@H2CO3:但是可以进行改进。上述代码将始终完成for循环。但是,您可以在找到一个false(当前答案中至少有一个为false)后跳出它。请澄清您是否要检查数组是否只包含相同的值(全部为true或全部为false),或者是否为true(全部为true)和false(全部为false)。@Chris不过,这仍然需要线性时间。(是的,我确实在搜索循环中使用了
break;
。)值得注意的是,在引擎盖下,除了短路之外,这也在做同样的事情,只是使用了更简洁的语法。这就是我要找的,我知道花时间是一样的,但时间更短,有时可能会有用。如果(cond)result=true/false,千万不要写
。相反,写
result=(!)cond。同样,永远不要与布尔常量比较,它是多余的。你可以说:
Checked=!CheckPart.Any(q=>q==false)。每当您在
if
else
中设置布尔变量时,您都应该直接设置它。@NominSim胡说八道。它和其他的一样,只是更加冗长。@NominSim
All
也会短路,短路时间与短路时间完全相同。两者都不是更好的。
Enumerable.All()
在发现第一项计算结果为
false
后,也将停止计算输入。还应添加短路。@Chris:减轻比较检查,然后分配。@BradChristie,与OP相比,即使是一个净赢,添加短路会使该方法平均快2倍。@Servy:根据我的计算,它更像快5倍。一次比较的一半时间就足够了,二次比较的四分之一时间就足够了,以此类推。当然,确切的节约取决于数据以及它对真或假的偏向程度。可能本质上与OP的秘密相同,但他没有要求更好的方法,只是另一种方法。此外,它还附带了解释和代码+1.
Boolean allAreTrue = true;
for (var i = 0; i < CheckPart.Length && allAreTrue; i++){
  allAreTrue &= CheckPart[i];
}
public static class BooleanExtender
{
    public static Boolean AllAreFalse(this Boolean[] items)
    {
        for (var i = 0; i < items.Length; i++)
            if (items[i]) return false;
        return true;
    }

    public static Boolean AllAreTrue(this Boolean[] items)
    {
        for (var i = 0; i < items.Length; i++)
            if (!items[i]) return false;
        return true;
    }
}

new Boolean[]{ ... }.AllAreTrue();
new Boolean[]{ ... }.AllAreFalse();