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胡说八道。它和其他的一样,只是更加冗长。@NominSimAll
也会短路,短路时间与短路时间完全相同。两者都不是更好的。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();