【问题标题】:What is the most efficent way to perform boolean logic operations in C#.NET?在 C#.NET 中执行布尔逻辑运算的最有效方法是什么?
【发布时间】:2011-05-06 02:21:30
【问题描述】:

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

我现在想弄清楚的是,如果我有一些由节点或子节点返回的布尔集合,那么将上述逻辑类型应用于此列表的最有效方法是什么?我马上就开始写foreach 语句,但似乎由于二进制逻辑对于计算机的工作方式是如此重要,所以会有一种更好、更快、迭代更少的方法。

【问题讨论】:

  • 你有 NAND 和 NOR 倒退。
  • 啊,是的,谢谢您指出这一点。我修好了。

标签: c# .net boolean-logic .net-3.5 .net-4.0


【解决方案1】:

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);

这实际上仍然只是一个foreach,但它们更加紧凑,AllAny 操作符合您的需要。

p =&gt; 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());

【讨论】:

  • 啊哈! ..谢谢比我想做的更干净。
  • 我听说互联网上有谣言(感谢 G W Bush),在某些情况下,LINQ 可能会因为不明显的原因而变慢。我不知道这些情况包括什么。建议尝试这种方法并衡量这种方法的相对速度和“笨拙”的迭代方法。
猜你喜欢
  • 2016-08-19
  • 1970-01-01
  • 2022-11-03
  • 2010-10-14
  • 2014-05-10
  • 2017-06-28
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多