【问题标题】:Is there a way to detect one, a combination, or none of multiple boolean values in C#?有没有办法在 C# 中检测一个、组合或不检测多个布尔值?
【发布时间】:2020-10-09 16:26:52
【问题描述】:

我有 4 个布尔值,它可以是一个、多个的组合或没有。我的最终输出是,我知道哪些布尔值设置为 true。

例如:只有一个/只有一个和两个/只有一个、两个和三个/全部一、二、三、四/只有二和三/等等..

我开始使用 If - 语句手动编写这些代码,但后来我开始意识到: 1:这段代码看起来很混乱。 2:这个方法会很费力 3. 应该有更好的方法吧?

【问题讨论】:

  • 您是否考虑过切换到 flag enum 或者您是否受限于布尔值?
  • 如果你有一个booleans集合,比如bool[] booleans,你可以使用Linq查询:if (booleans.All(x => x)) {...}if (booleans.Count(x => x) == 1) {...}
  • 最终输出是什么?任何解决方案都将针对此,因为您似乎在说 if(b1&&b2) 会做一些与 if(b2&&b3) 不同的事情,所以这不仅仅是关于正确的布尔值的数量
  • 这里有点不清楚你想要什么。只计算真值的个数就够了吗,如果等于长度就是全部,如果0为无,其他都是多个的组合。
  • 感谢您的所有回复!我的最终输出是,我知道哪些布尔值设置为 true :-)

标签: c# boolean combinations


【解决方案1】:

如果您有一个 集合 布尔值,例如

 bool[] flags = new bool[] {
   first,
   second,
   third,
   ...
   last 
 };

您可以在 Linq 的帮助下查询它们:

using System.Linq;

... 

if (flags.All(x => x)) {
  // if all booleans are true 
}

if (flags.Count(x => x) == 2) {
  // if exactly two booleans are true 
} 

if (flags.Count(x => x) >= 3) {
  // if at least 3 booleans are true 
} 

if (flags.Count(x => x) <= 4) {
  // if at most 4 booleans are true 
} 

if (flags.Any(x => x)) {
  // if at least 1 boolean is true; 
  // it can be done with a help of Count, but Any is more readable 
} 

【讨论】:

  • Any 只处理一种情况。这个答案解决了你提到的每一个案例
  • 请不要重复拨打CountAnyAll 是短路的,但 Count 不是,所以你想调用它一次,保存结果,然后多次测试该结果..
【解决方案2】:

如果您想使用某种名称输出它们,除了 Dmitiry 的 answer 建议的 bool 值之外,请将名称添加为文本:

var flags = new[]
   { 
     new { Value = one,   Name = nameof(one)},
     new { Value = two,   Name = nameof(two)},
     new { Value = three, Name = nameof(three) }
   };

var trueCount = flags.Count(x => x.Value);
var names = String.Join(",", flags.Where(x => x.Value).Select(x => x.Name));

if (trueCount == 0) return $"none";
if (trueCount == 1) return $"just {names}";
else if (trueCount < flags.Length) return $"only {names}";
else return $"all {names}";

注意:如果您想做的不仅仅是计算真/假,切换到[Flags] 枚举可能会很有用。或者考虑切换到Dictionary&lt;string, bool&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2021-12-21
    相关资源
    最近更新 更多