C# 检查许多布尔人

C# 检查许多布尔人,c#,C#,我有许多布尔变量,如下所示: Boolean A; Boolean B; Boolean C; Boolean D; Boolean E; Boolean F; ... 我想确保所有这些都是假的,或者最多只有一个是真的 有没有一种不使用大量IFs的快速方法可以做到这一点?是的。将所有布尔值放入一个列表中,然后使用.all()或.Any()扩展方法 var options = new List<bool>{A, B, C, D, E, F, etc.}; var allAreFals

我有许多布尔变量,如下所示:

Boolean A;
Boolean B;
Boolean C;
Boolean D;
Boolean E;
Boolean F;
...
我想确保所有这些都是假的,或者最多只有一个是真的


有没有一种不使用大量IFs的快速方法可以做到这一点?

是的。将所有布尔值放入一个列表中,然后使用
.all()
.Any()
扩展方法

var options = new List<bool>{A, B, C, D, E, F, etc.};
var allAreFalse = options.All(b => !b);
var atLeastOneIsTrue = options.Any(b => b);
var moreThanOneIsTrue = options.Where(b => b).Skip(1).Any();
var options=新列表{A、B、C、D、E、F等};
var allarfalse=options.All(b=>!b);
var atlestoneistrue=options.Any(b=>b);
var moreThanOneIsTrue=options.Where(b=>b).Skip(1).Any();

PS——首先,您可能不想将所有这些布尔值声明为单独的变量。这样的代码通常表示您将数据表示为代码,并且应该使用数据结构来表示和操作这些值。

将它们添加到列表中并计算真实值:

var lst = new[] { A, B, C, D, E };
var res = lst.Count(x=>x) <= 1;
var lst=new[]{A,B,C,D,E};

var res=lst.Count(x=>x)
unsigned long var64=(x&a您的意思可能是
&
而不是
&
,并且您可以使用
&
将它们全部网格化,而不进行移位,真的……但这并不完全是OP想要的信息。可能需要另一个数据结构来保存它们(类似于单个64位长的整数)这并不能回答他的问题:我想确定所有这些都是假的,或者最多只有一个是真的。@brz:我认为这个问题代表了两个不同的要求,因为如果只有一个是真的,那么它们显然不都是假的。我分别展示了如何确定它们是否都是假的,以及是否有多个是真的。下面的OP可以自由地从这些可能性中挑选和混合,因为他认为合适。为什么这么多人投票给一个可能错误的答案?我是否错过了要点?@brz的答案是这里唯一正确的答案。几乎和你的上一个答案一样,但似乎是OP所问的:
bool allFalseOrOneTrue=!bools.Where(b=>b)。Skip(1)。Any()
@Mrchief:我想大多数人(包括OP)都认识到这提供了OP丢失的信息。正如我已经指出的,“全部错误”和“最多一个正确”是多余的,因此OP很可能需要在一种情况下检查其中一种,在另一种情况下检查另一种。通过演示如何创建基本构建块,我使他(以及其他有类似问题的人)能够为了方便地调整这些片段以满足其需要。例如,要检查一个或几个片段是否正确,您可以使用
!morethaneistrue
+1这是将
true
的数量限制为零或一次的正确且简洁的方法。如果使用
new[]
而不是
List
,则应给出另一个+1。
boolean[] bools = new boolean[...];

// add all bools to list

if (!bools.All()) {
    // All are false
}
if (bools.Any()){
    // One or more are true
}
 unsigned long var64 = (X & A<<1 & B<<2 & C<<3 .... Z <<63)+1