在C#.NET中执行布尔逻辑运算的最有效方法是什么?

Eri*_*tas 3 .net c# boolean-logic .net-4.0 .net-3.5

我正在为我们在办公室使用的另一件软件写一个插件,允许用户审核他们正在处理的文件.我试图让我的工具尽可能灵活.我的想法是用户将生成一个节点树,其中可以包含其他节点作为子节点.在树的底部,节点将是根据用户正在使用的文件而失败或通过的条件节点.此外,用户可以将每个节点设置为特定的逻辑类型,包括AND,OR,NOR,NAND .

AND:  All sub nodes must pass 
OR:   At least one sub node must pass 
NAND: At least one sub node must fail
NOR:  All sub nodes must fail 
Run Code Online (Sandbox Code Playgroud)

我现在要弄清楚的是,如果我有一些由节点或子节点返回的bool集合,那么将上述逻辑类型应用于此列表的最有效方法是什么?我手头开始编写foreach语句,但似乎二进制逻辑对于计算机工作的方式来说是如此根本,因为它将是一种更好,更快,更少迭代的方法.

Pie*_*kel 5

Linq是你的朋友:

var booleans = new List<bool> { true, true, false, true };

bool allPass = booleans.All(p => p);
bool anyPass = booleans.Any(p => p);
bool allFail = booleans.All(p => !p);
bool anyFail = booleans.Any(p => !p);
Run Code Online (Sandbox Code Playgroud)

这仍然只是一个foreach,但它们更紧凑All,Any操作适合您的需要.

p => p是一个返回布尔值的lambda.例如,如果您正在检查具有方法的节点,则可以DoesThisPass像这样重写检查:

bool allPass = nodes.All(p => p.DoesThisPass());
bool anyPass = nodes.Any(p => p.DoesThisPass());
bool allFail = nodes.All(p => !p.DoesThisPass());
bool anyFail = nodes.Any(p => !p.DoesThisPass());
Run Code Online (Sandbox Code Playgroud)