我在使用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的行,同时更改表以澄清一个真实的例子。
答案 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)
您可以使用linq执行此操作,例如,添加此命名空间:
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
表达式中的任何一个OR
和true
表达式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")))