if(a或b)和c语句

时间:2013-12-18 17:53:48

标签: c# if-statement

我在使用if选项时遇到困难。

版本1匹配所有而不考虑&& 。载( “上”)

if ( 
     || drow["ifName"].ToString().ToLower().Contains("vlan")
       || drow["ifName"].ToString().ToLower().Contains("st0")
       || drow["ifName"].ToString().ToLower().Contains("ge-0")
     && drow["ifStatus"].ToString().ToLower().Contains("up")
)

版本2与无匹配。

if ( (
       || drow["ifName"].ToString().ToLower().Contains("vlan")
       || drow["ifName"].ToString().ToLower().Contains("st0")
       || drow["ifName"].ToString().ToLower().Contains("ge-0")
     )
     && drow["ifStatus"].ToString().ToLower().Contains("up")

我遗失的东西?

表看起来基本上像

ifName   |   ifStatus
vlan.0   |   up
st0.1    |   up
pp0.0    |   up
ge-0/0/0 |   down

编辑:

所以我们的目标是只匹配ifStatus = UP的行,同时更改表以澄清一个真实的例子。

5 个答案:

答案 0 :(得分:5)

你打算解析什么?逻辑OR(||)和逻辑AND(&&)都是左关联的,并且具有不同的运算符优先级:

http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

逻辑AND比逻辑OR更紧密地绑定,因此,像

这样的表达式
A || B || C && D

解析好像是写的

A || B || ( C && D )

如果这是你的意图,那你很好。如果没有,您需要根据需要添加括号以获得所需的解析。我怀疑你的预期解析更像是:

(A || B || C ) && D

但这不是原始测试解析的方式。

作为一个很好的一般规则,如果您在逻辑表达式中混合使用AND和OR,始终使用括号来表示您的意图。逻辑表达式中误解运算符优先级是错误的主要来源。

答案 1 :(得分:0)

这可能无法解决您的问题,但它应该可以让您更轻松地查看您正在做的事情,并使列表更易于维护:

var matchNames = new[] {"a", "b", "c", "vlan.10"};
if (drow["ifStatus"].ToString().ToLower().Contains("up") //check up first, because it's cheaper
     && matchNames.Any(m => drow["ifName"].ToString().ToLower().Contains(m) )
{
    //...
}

答案 2 :(得分:0)

您可以使用执行此操作,例如,添加此命名空间:

using System.Linq;

试试这个:

string[] items = new[] { "vlan.10", "a", "b", "c" };

if (drop["IfStatus"].ToString().IndexIf("up", StringComparison.OrdinalIgnoreCase) > -1 &&
    items.Any(x => drop["IfName"].ToString().IndexOf(x, StringComparison.OrdinalIgnoreCase) > -1)
{
   // true...             
}

了解Turkey Test,它显示了使用IgnoreCase方法比较Contains的重要原因。

答案 3 :(得分:0)

在这里使用正则表达式可以简化逻辑。

if((Regex.IsMatch(drow["ifName"].ToString().ToLower(), "[abc]"))
   && (Regex.IsMatch(drow["ifStatus"].ToString().ToLower(), "up")))
{
}

答案 4 :(得分:-1)

在第一种情况下:如果任何一个表达式(OR表达式或AND表达式)的计算结果为true,则会生成true
注意:它类似于if(A || B || C || D && E)

因此,如果任何OR表达式in (A,B,C)评估为true或表达式D and E评估为true,则会true

在第二种情况下如果true表达式中的任何一个ORtrue表达式AND,则会生成drow["ifStatus"].ToString().ToLower().Contains("up")当你使用括号对时,也必须是true

注意:它类似于if( (A || B || C || D) && (E) )

因此,如果OR表达式(A,B,C,D)中的任何一个应该评估为true,并且AND表达式E必须为true才能生成结果true

试试这个:

String name=drow["ifName"].ToString().ToLower();
Sting status=drow["ifStatus"].ToString().ToLower(); 

if ( (name.Contains("vlan.10") || name.Contains("a") || name.Contains("b") 
       || name.Contains("c")) && (status.Contains("up")))