0

我不确定要进行的比较的术语:

if(test1 == true && test2 == true || test2 == true && test3 == true || test3 == true && test4 == true...)
{
   //Do stuff
}

是否有有效的方法/功能来实现这一点?否则,我将有一个非常长的 if 语句。任何帮助表示赞赏。

4

10 回答 10

3

您不必指定==true零件。可以写成如下。

if(test1 && test2 || test2 && test3 || test3 && test4...)
{
   //Do stuff
}

如果你想简化表达式本身,我建议你研究布尔代数和布尔表达式的归约

这是一种形式的表达AB + BC + CD + ...。您可以执行的一项减少如下。

AB + BC = B(A+C) = B && (A || C)

一个列表也可以用来存储所有不同的布尔值,并且可以使用对它们的一次迭代来计算它。这有助于提高可读性,而性能/内存占用几乎没有变化或仅略有下降。

于 2012-07-22T18:42:27.540 回答
3
var tests = new[] { test1, test2, test3, test4, ... };

for (int i = 0; i < tests.Length - 1; ++i) {
   if (tests[i] && tests[i + 1]) {
     // Do stuff
     break;
   }
}
于 2012-07-22T18:46:55.973 回答
0

你可以只使用if(test1 && test2 || ...)

或者您可以将其分解为多个步骤

您是否有所有单独的变量或者它们是否在数组/列表中在后一种情况下,您可以在循环中迭代它们。

bool result = true;

foreach (bool b  in boolArray)
{
   result = result op b;
}
于 2012-07-22T18:43:16.780 回答
0

您可以简单地消除布尔比较

if( (test1 && test2))相当于if(test1 == true && test2 == true)

于 2012-07-22T18:45:01.337 回答
0

我能想到的最短的是:

if((test2 && (test1 || test3)) || (test3 && test4)) {
    //Do Stuff
}
于 2012-07-22T18:46:34.963 回答
0

如果您不介意将您的布尔值放在列表中并由 linq 使用

例如

bool test1 = true;
bool test2 = true;
bool test3 = true;
bool test4 = true;

List<bool> booList = new List<bool>{test1, test2, test3, test4};

bool isTrue = booList.All(b => b == true); //This will return true


bool test5 = false;
booList.Add(test5);


bool isFalse = booList.All(b => b == true); //This will return false

PS:我不知道与 if 语句相比性能如何

于 2012-07-22T18:49:44.007 回答
0
char test[x]

... test[x] init ...

i=0
res=0

while( i < x-2 )
{
    res |= test[i] && test[i+1]
}
于 2012-07-22T18:49:46.723 回答
0

使用 C# 时,您可以使用逻辑处理布尔值。:)

如果 bool1,则买一些冰淇淋;

如果 bool1 不存在,则不要购买冰淇淋;

将值与 0 进行比较时,可以使用非运算符 (!)。

if(!bool1)MessageBox.Show("没有冰淇淋伴侣");

与 0 比较时也是如此,只是不要应用非运算符(!)。

if(bool1)MessageBox.Show("冰淇淋 :D");

对不起,如果我把它弄糊涂了。

因此,要添加到其他人的帖子中,以下内容将是合适的。

if(bool1 && bool2 || bool1 && bool3)MessageBox.Show("冰淇淋!");

于 2012-07-22T18:50:08.500 回答
0

LINQ方式(假设值在一个数组中):

bool result = (from index in Enumerable.Range(0, tests.Length - 1)
               where tests[index] && tests[index + 1]
               select index).Any();
于 2012-07-22T20:15:21.410 回答
0

或者如果您可以将布尔值放入列表中,则可以转换为 LINQ.ANY

List<bool> booList = new List<bool> { true, true, true, true };
            bool isTrue = booList.Any(b => b);
            Console.WriteLine(isTrue.ToString());
            booList = new List<bool> { true, true, false, false };
            isTrue = booList.Any(b => b);
            Console.WriteLine(isTrue.ToString());
            booList = new List<bool> { false, false, false, false };
            isTrue = booList.Any(b => b);
            Console.WriteLine(isTrue.ToString());
于 2012-07-22T20:27:09.550 回答