是否有更短的方法来测试以下内容:
if (!((a == b) && (a == c) && (a == d) && (a == e) && (a == f)))
我最后写了一个让我这样做的方法
if (!AllEqual(new[] { a, b, c, d, e, f }))
感觉更好,更具可读性,但我想知道框架中是否有某些内容可以做到这一点?
答案 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 logic和logic gates到simplify你的等式。
(==
就像布尔值的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();
}
}
上的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个标志是什么的商业原因要么都是真的,要么都是假的。