如何在c#中测试多个布尔值是否具有相同的值?

时间:2010-11-10 07:07:50

标签: c# coding-style

是否有更短的方法来测试以下内容:

if (!((a == b) && (a == c) && (a == d) && (a == e) && (a == f)))

我最后写了一个让我这样做的方法

if (!AllEqual(new[] { a, b, c, d, e, f }))

感觉更好,更具可读性,但我想知道框架中是否有某些内容可以做到这一点?

8 个答案:

答案 0 :(得分:13)

一方面,您可以使用参数数组使其更简单:

public static bool AllEqual<T>(params T[] values)
...


if (AllEqual(a, b, c, d, e, f))
{
    ...
}

说实话,我觉得你找不到比这更简单的东西。我没有在其他地方或框架中看到这个。好吧,我想在LINQ中可以做一个的事情:

if (new { a, b, c, d, e, f }.Distinct().Count() == 1)

但那太可怕了:))

稍微更高效的版本是:

if (!(new { a, b, c, d, e, f }).Distinct().Skip(1).Any()))

...一旦找到第二个不同的元素,它将返回false。只有6个元素,我认为不值得担心:)

答案 1 :(得分:2)

仅当a,b,c,d,e和f为布尔值时

更好的方法是查看Boolean logiclogic gatessimplify你的等式。

==就像布尔值的XNOR gate一样)

一个例子:

(!((a == b) && (a == c) && (a == d) && (a == e) && (a == f)))

与:

相同
((a^b) || (a^c) || (a^d) || (a^e) || (a^f))

但是我认为对于那个

的逻辑进行修正一定很有意思

[编辑]关于Hightechrider's answers,命题

((a^b) || (a^c) || (a^d) || (a^e) || (a^f))

相当于:

((a != b) || (a != c) || (a != d) || (a != e) || (a != f))

但即使a,b,c,d,e和f不是布尔值,Hightechrider's proposition也能正常工作。

答案 2 :(得分:1)

你可以分发!进入表达式:

if ((a != b) || (a != c) || (a != d) || (a != e) || (a != f)))

您也可以使用Any或! All而不是添加新方法。

if (new[]{b, c, d, e, f}.Any(x => x != a)) ...

答案 3 :(得分:1)

你可以用它来检查它们是否都是真的:

if (a && b && c && d && e && f) {
    ...
}

这是为了检查它们都是假的:

if (!(a || b || c || d || e || f)) {
    ...
}

你可以将它们结合起来检查它们是否相等:

if ((a && b && c && d && e && f) || !(a || b || c || d || e || f))
    ...
}

但坦率地说,这并不比原来的解决方案好: - )

基于以上所述,这是AllEqual

的可能实现
public static bool AllEqual(bool[] values)
{
    bool andTerm = true;
    bool orTerm = false;
    foreach (bool v in values)
    {
        andResult &= v;
        orResult |= v;
    }
    return andTerm || !orTerm;
}

答案 4 :(得分:1)

使用BitArray

  

管理一个紧凑的位值数组,   代表布尔人,   其中true表示该位是   on(1)和false表示该位   关(0)。

// Your collection of bits
bool a = false, b = false, c = false;
// get them into an array
bool[] d = new bool[] { a, b, c };
// intialize BitArray with that array
System.Collections.BitArray e = new System.Collections.BitArray(d);
// use OfType<>, Any<>, All<>
if (Convert.ToBoolean(e.OfType<bool>().Any<bool>(condition => condition.Equals(true)) && e.OfType<bool>().Any<bool>(condition => condition.Equals(false)))) Console.WriteLine("some one is TRUE!.");

用于演示的示例控制台应用程序代码:

    class Program
    {
        static void Main(string[] args)
        {
            bool a = false, b = false, c = false;
            bool[] d = new bool[] { a, b, c };
            System.Collections.BitArray e = new System.Collections.BitArray(d);
            if (Convert.ToBoolean(e.OfType<bool>().Any<bool>(condition => condition.Equals(true)) && e.OfType<bool>().Any<bool>(condition => condition.Equals(false)))) Console.WriteLine("some one is TRUE!.");
            if (Convert.ToBoolean(e.OfType<bool>().Any<bool>(condition => condition.Equals(true)) && e.OfType<bool>().Any<bool>(condition => condition.Equals(false)))) Console.WriteLine("some one is FALSE!.");
            if (Convert.ToBoolean(e.OfType<bool>().All<bool>(condition => condition.Equals(true)))) Console.WriteLine("All of them are TRUE!.");
            if (Convert.ToBoolean(e.OfType<bool>().All<bool>(condition => condition.Equals(false)))) Console.WriteLine("All of them are false!.");
            Console.ReadLine();
        }
    }

BitArray

上的MSDN文档

答案 5 :(得分:1)

怎么样..

List<bool> arr = new List<bool>{ a, b, c, d, f };
bool allEqual = arr.TrueForAll(x => { return x; }) || arr.TrueForAll(x => { return !x; });

对我来说看起来很优雅。 :)

答案 6 :(得分:0)

我认为将依赖项仅引入框架并不是一个好主意。

答案 7 :(得分:0)

这不是人们通常想知道的事情。你可以通过将它们放在一起来轻松地检查它们是否都是真的,或者通过将它们放在一起它们都是错误的。它在C ++中也很受欢迎,可以将bool转换为int并将它们添加起来 - 在你的情况下,你需要总共查找6或0.但我认为这两个都会模糊你知道6个标志是什么的商业原因要么都是真的,要么都是假的。